PDA

View Full Version : مبتدی: منطق درست اجرای نادرست کد زیر



Mahmoud.Afrad
یک شنبه 14 آذر 1389, 07:01 صبح
کد زیر می بایست با فشردن کلید alt
5واحد به عدد b اضافه کند و در صورتی که کلید فشرده شده ctrl باشد 10 واحد از عدد کم کند و هر بار عدد را نمایش دهد ، اما خروجی تغییرات درستی ندارد.
برای نمایش عدد b (حداکثر سه رقمی)آنرا با تقسیمهای متوالی بر 10 به ارقام تشکیل دهنده تبدیل و آنها را پشت سر هم نمایش دادیم.


;

stack segment stack ; define stack
dw 200h dup(?)
stack ends

data segment ; define var

sec1 db ?
sec5 db ?
sec10 db ?

cout db ?

B db 50
b0 db ?
b1 db ?
b2 db ?
temp db ?




data ends

code segment
assume cs:code , ds:data , ss:stack

start:
mov ax,seg data
mov ds,ax



L1: mov BL,10 ;divide number to digits ( b= b2b1b0 )
mov ah,0
mov al,b
div BL
mov b0,ah
mov ah,0
div BL
mov b1,ah
mov ah,0
div BL
mov b2,ah

mov ah,02h ;Set cursor position
mov dh,12
mov dl,39
int 10h

mov ah,02 ;Display output
add b2,48
mov dl,b2
int 21h
add b1,48
mov dl,b1
int 21h
add b0,48
mov dl,b0
int 21h

L2: mov al,0
mov ah,12h ;Get enhanced shift flags
int 16h
mov temp,al

and al,8h ;If press alt +5
cmp al,8h
jnz h2
add b,5
jmp L1

h2: mov al,temp ;If press ctrl -10
and al,4h
cmp al,4h
jnz L2
sub b,10
jmp L1





mov al,0
mov ah,4ch
int 21h
code ends
end start
end start

xman_1365_x
دوشنبه 15 آذر 1389, 01:15 صبح
ظاهرا درسته اما فعلا وقت بررسي كد رو ندارم انشا الله كه عجله نداريد
روي emu8086 مشكل چاپ نداشت، اما چون وقفه 12 كيبورد رو نميشناخت با tasm تست كردم هم در خروجي و هم در جمع اشتباه ميشه

خودت با چي تست كردي؟
يك ايراد هاي كوچولو هم داره
مثل:
mov ax,seg data
و صفر پشت عدد هم يك شرط بزار كه چاپ نشه! كلا خوب ننوشتي ميشه كوتاهش كرد
اون متغيير ها و پشته اي كه استفاده نشده براي چيه؟ اگه شد سورس كاملم بزار

Mahmoud.Afrad
دوشنبه 15 آذر 1389, 01:30 صبح
ظاهرا درسته اما فعلا وقت بررسي كد رو ندارم انشا الله كه عجله نداريد
روي emu8086 مشكل چاپ نداشت، اما چون وقفه 12 كيبورد رو نميشناخت با tasm تست كردم هم در خروجي و هم در جمع اشتباه ميشه

خودت با چي تست كردي؟
يك ايراد هاي كوچولو هم داره
مثل:
mov ax,seg data
و صفر پشت عدد هم يك شرط بزار كه چاپ نشه! كلا خوب ننوشتي ميشه كوتاهش كرد
اون متغيير ها و پشته اي كه استفاده نشده براي چيه؟ اگه شد سورس كاملم بزار

بازم ممنون که وقت گذاشتید.

با masm کامپایل کردم.
کلا ایرادهاش چیه؟
اون متغیرها و پشته از اول توی فایل تستی که استادمون در اختیارمون گذاشت تا شکل کلی سگمنتها را بدانیم بود و من فقط کدی رو که لازم داشتم اضافه کردم.

xman_1365_x
دوشنبه 15 آذر 1389, 20:51 عصر
الان برنامه رو اجرا كردم در masm
تا جاي چاپ درست اما بعدش مشكل داره
63194
مشكلشم بايد همون منطقت باشه اگرنه درست ميشد:لبخند:
براي حل مشكل كنترل و آلت يعني اين قسمت رو دوباره فكر كن روش:چشمک:


L2: mov al,0
mov ah,12h ;Get enhanced shift flags
int 16h
mov temp,al

and al,8h ;If press alt +5
cmp al,8h
jnz h2
add b,5
jmp L1

h2: mov al,temp ;If press ctrl -10
and al,4h
cmp al,4h
jnz L2
sub b,10
jmp L1

و يك چيزم يادت نره توي نمايش مثلا 50 دادي در خروجي 050 نشون ميده
هنوز منطق برنامت كامل نيست كه بعد از فشردن كليد هاي كنترلي جمع و تفريق هاي عجيب ميشه:لبخندساده:
اگر بازم نتونستي بگو!
موفق باشي