PDA

View Full Version : مشکل در Link کردن (اسمبلی)



Sp|R|T
دوشنبه 16 خرداد 1390, 19:29 عصر
سلام

من یک برنامه ای به زبان اسمبلی نوشتم کارش اینه که یک عدد رو میگیره اگر عدد از بین 20 تا 10 بود A رو چاپ کنه ، اگر از 10 تا 5 بود B و 5 تا 0 هم C چاپ کنه و حلقه هم با وارد کردن 0 میاد بیرون

این از کد:


; Example assembly language program
; Author: R. Detmer
; Date: revised 7/97

.386
.MODEL FLAT

ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD

INCLUDE io.h ; header file for input/output

cr EQU 0dh ; carriage return character
Lf EQU 0ah ; line feed

.STACK 4096 ; reserve 4096-byte stack

.DATA ; reserve storage for data
gread WORD ?
nmsg BYTE "Plz Enter a number: ",cr, lf, 0
amsg BYTE "A",cr, lf, 0
bmsg BYTE "B",cr, lf, 0
cmsg BYTE "C",cr, lf, 0
value BYTE 16 DUP (?)
Result BYTE 11 DUP (?),0

.CODE ; start of main program code
_start:
output nmsg
input value,16
atoi value
mov gread,ax
beginofwhile:
cmp gread,0
jnle endofwhile
cmp gread,20
output amsg
jmp beginofwhile
cmp gread,10
output bmsg
jmp beginofwhile
cmp gread,5
output cmsg
jmp beginofwhile
endofwhile:

itoa result,ax
output result


INVOKE ExitProcess, 0 ; exit with return code 0

PUBLIC _start ; make entry point public

END ; end of source code


یه نگاهیش بکنین ببینین کجاش اشکال داره

اسمبلینگ میشه ولی موقع Link کردن ارور میده

این هم پیغام ارور:

LINK : fatal error LNK1181: cannot open input file "subsystem:console.obj"

یک کد که 100% مطمئنم درسته موقع لینک کردن باز همین ارور رو میده :افسرده:

این هم از فرمانی که برای Link کردن استفاده میکنم:

link subsystem:console entry:start example.obj io.obj kernel32.lib

پ.ن: فکر کنم مشکل از اسمبلرم باشه چون اسمبلر رو از بچه ها گرفتم و وقتی توی کامپیوترم زدم آنتی ویروسم یکی از فایل ها رو پاک کرد - کسی اگه اسمبلرش رو داره لطف کنه بزاره ، شدید لازم دارم :ناراحت:

tdkhakpur
دوشنبه 16 خرداد 1390, 20:26 عصر
فکر کنم مشکل از اسمبلرم باشه چون اسمبلر رو از بچه ها گرفتم و وقتی توی کامپیوترم زدم آنتی ویروسم یکی از فایل ها رو پاک کرد - کسی اگه اسمبلرش رو داره لطف کنه بزاره

کامپایلر خط فرمان برای کاربران اسمبلی (http://barnamenevis.org/showthread.php?203406-کامپایلر-خط-فرمان-برای-کاربران-اسمبلی)

Sp|R|T
سه شنبه 17 خرداد 1390, 00:23 صبح
ممنون tdkhakpur :لبخندساده:

ولی این کامپایلری که شما معرفی کردین کلآ با کامپایلری که استادمون داده فرقه

من واسه کمپایل کردنش اول باید فایل asm رو به obj و سپس obj رو به exe تبدیل میکنم

که برای asm به obj از این خط فرمان استفاده میکنم:

ml /c /coff exp.asm

و برای obj به exe از این خط فرمان:

link subsystem:console entry:start exp.obj io.obj kernel32.lib

من اینگونه کمپایلری رو میخوام.

تشکر

Sp|R|T
سه شنبه 24 خرداد 1390, 02:39 صبح
کسی نیست کمک کنه ؟ :ناراحت:

xman_1365_x
سه شنبه 24 خرداد 1390, 18:59 عصر
كدتون چند تا ايراد جزئي داشت


; Example assembly language program
; Author: R. Detmer
; Date: revised 7/97

.386
.MODEL FLAT

ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD

INCLUDE io.h ; header file for input/output

cr EQU 0dh ; carriage return character
Lf EQU 0ah ; line feed

.STACK 4096 ; reserve 4096-byte stack

.DATA ; reserve storage for data
gread WORD ?
nmsg BYTE "Plz Enter a number: ",cr, Lf, 0
amsg BYTE "A",cr, Lf, 0
bmsg BYTE "B",cr, Lf, 0
cmsg BYTE "C",cr, Lf, 0
value BYTE 16 DUP (?)
Result BYTE 11 DUP (?),0

.CODE ; start of main program code
_start:
output nmsg
input value,16
atoi value
mov gread,ax
beginofwhile:
cmp gread,0
jnle endofwhile
cmp gread,20
output amsg
jmp beginofwhile
cmp gread,10
output bmsg
jmp beginofwhile
cmp gread,5
output cmsg
jmp beginofwhile
endofwhile:

itoa Result,ax
output Result


INVOKE ExitProcess, 0 ; exit with return code 0

PUBLIC _start ; make entry point public

END ; end of source code

كد رو در فايلي با اسم test.asm ذخيره كنيد بعد در مسيري كه ml هست ذخيره كنيد و دستورات رو در كنسول وارد كنيد
با دستور زير فايل آبجكت رو بسازيد
ml /c /coff /Cp test.asm
و با اين دستور فايل اجرايي رو بسازيد
link /debug /subsystem:console /entry:start /out:test.exe test.obj io.obj kernel32.lib

ضمنا ورژن اسمبلري كه تست كردم
Microsoft (R) Macro Assembler Version 6.11
Copyright (C) Microsoft Corp 1981-1993. All rights reserved.

xman_1365_x
سه شنبه 24 خرداد 1390, 20:00 عصر
با توضيحي كه شما در كامنت اول نوشتيد برنامتون اشتباه هست
اينم درستش:چشمک:


.386
.MODEL FLAT

ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD

INCLUDE io.h ; header file for input/output
cr EQU 0dh ; carriage return character
Lf EQU 0ah ; line feed

.STACK 4096 ; reserve 4096-byte stack

.DATA ; reserve storage for data

gread WORD ?
nmsg BYTE "Plz Enter a number: ", 0
amsg BYTE "A",cr, Lf, 0
bmsg BYTE "B",cr, Lf, 0
cmsg BYTE "C",cr, Lf, 0
value BYTE 16 DUP (?)
Result BYTE 11 DUP (?),0

.CODE ; start of main program code
_start:

output nmsg
input value,16
atoi value

;check for 0-5
cmp ax,0
jb end_check
cmp ax,5
ja next_check
output cmsg
jmp end_check
next_check:
;check for 5-10
cmp ax,10
ja next_check2
output bmsg
jmp end_check
next_check2:
;check for 11-20
cmp ax,20
ja end_check
output amsg
end_check:

input value,1
INVOKE ExitProcess, 0 ; exit with return code 0
PUBLIC _start ; make entry point public
END ; end of source code


موفق باشي