ورود

View Full Version : کار با ماکرو ها



ho3ein.3ven
جمعه 08 دی 1391, 13:44 عصر
سلام
من توی برنامم از ماکرو استفاده می کنم ولی برنامه جواب نمیده .
دوستان اگه ممکنه کد زیر رو چک کنین :
string macro data1
mov ah,09
mov dx, offset data1
int 21h
endm
.model small
.data
mess db "welcome..$"
.code
main proc far
push ds
sub ax,ax
mov ax,@data
mov ds,ax
;-----
string mess
ret
main endp
end main

Delphi Coder
جمعه 08 دی 1391, 22:59 عصر
جواب نمیده یعنی چی؟ یعنی آخرش برنامه هنگ میکنه؟ رشته ای که باید چاپ بشه چاپ نمیشه؟ Error زمان اسمبل میده؟ مشکلتون رو باید مشخصتر بنویسید.

ho3ein.3ven
شنبه 09 دی 1391, 10:38 صبح
سلام.با تشکر از پاسختون.
اینم یک عکس از خطایی که برنامه میده :
97470

Delphi Coder
شنبه 09 دی 1391, 15:59 عصر
push ds
این دستور باعث میشه مقدار سگمت DS به استک بره و چون بعد با دستور POP از استک برداشته نشده باعث میشه دستور ret مقدار اشتباه از استک برداره و CPU به کل از مسیر منحرف بشه و شما همچین error ای بخورید دستور رو بردارید نیازی بهش نیست یا اینکه قبل ret دوباره pop کنید.
توضیح اضافی اینکه دستور ret باعث میشه یک آدرس از استک برداشته بشه و jump بشه به اون آدرس. ret پایان برنامه در حالت عادی مقدار صفر رو برمیداره و بنابراین کنترل به افست صفر سگمنت CS میره از افست صفر تا 255 با اسم PSP(Program Segment Prefix) شناخته میشه و در آدرس صفر این قسمت دستور int 20h قرار داره. وظیفه int 20h پایان برنامه هست برای همین هم دستور ret پایان برنامه به اجرای برنامه خاتمه میده.

ho3ein.3ven
شنبه 09 دی 1391, 16:45 عصر
هیچ فرقی نکرد باز هم همون اررور رو میده

Delphi Coder
شنبه 09 دی 1391, 17:56 عصر
برنامه رو میتونید به همراه فایل اجرایی بزارید اینجا؟

ho3ein.3ven
شنبه 09 دی 1391, 22:19 عصر
اینم به صورت کامل

97519

Delphi Coder
یک شنبه 10 دی 1391, 00:49 صبح
مشکل همون ret هست. به خاطر اینکه برنامه model small تعریف شده و به شکل فایل EXE هست دستور ret جوابگو نیست برای خروج از برنامه باید از تابع 4Ch وقفه 21h استفاده کنید.

mov ax,4c00h ; ah=4Ch al=00h
int 21h