PDA

View Full Version : اجرا نشدن اولین تابع فراخوانده شده



user68
شنبه 17 اردیبهشت 1390, 15:06 عصر
با سلام

من این برنامه رو نوشتم البته هنوز کامل نیست خیلی مونده تا کامل بشه نمیدونم چرا وقتی اجراش میکنم مد مانیتور رو تغییر نمیده (call mod) و پروسیجر های بعدی رو فقط اجرا میکنه حالا اگه جای ها رو عوض کنم بازم اولین پروسیجررو فراخوانی نمیکنه اما اگه تیکه اول رو تو یه فایل جدا بنویسم جواب میده!! مشکل از کجاست؟
با تشکر




cod-seg segment
assume ss: cod-seg ds: cod-seg cs: cod-seg
org 100h
xpos db 0ch
ypos db 37h
lastdirect db 1

start:jmp main
main proc near
call mod
call t
call mar



l3:mov ax,4c00h
int 21h
main endp
mod proc near

mov ah,00h
mov al,03h
int 10h
mod endp
t proc near
mov ah,02h
mov dh,ypos
mov dl,xpos
int 10h
ret
t endp
mar proc near
mov lastdirect,1h
mov cx,4
mov al,16h
l1:mov ah,0eh
mov bh,00h
mov bl,07h
int 10h
loop l1
mov al,138
mov ah,0eh
mov bh,00h
mov bl,07h
int 10h
mov ah,01h
int 16h

jnz direction
jmp l3
direction:
mov lastdirect,1
cmp ah,4dh
mov dh,ypos+2
mov dl,xpos+2
mov ah,02h
int 10h
call clrscr
call mar
mar endp


clrscr proc near
mov ax,0600h
mov cx,0000h
mov dx,184fh
int 10h
clrscr endp

tdkhakpur
شنبه 17 اردیبهشت 1390, 15:14 عصر
کد تغییر مد رو با پارامتر اشتباه وارد کردید.


mod proc near
mov ah,00h
mov al,13h ;mov al,03h
int 10h

user68
یک شنبه 18 اردیبهشت 1390, 12:24 عصر
کد تغییر مد رو با پارامتر اشتباه وارد کردید.


mod proc near
mov ah,00h
mov al,13h ;mov al,03h
int 10h

نه این 03 مانیتور رو به حالت متن میبره. درسته . امروز داشتم رو برنامم کار میکردم یه جایی از برنامه یه متغیر استفاده کردم و اون بالا تعریفش کردم وقتی برنامه رو اجرا کردم تو مد متن رفت!! این emu هم قاطی داره . دوباره اومدم یه مقدار اولیه بهش دادم دوباره تو مد متن نرفت!!

user68
یک شنبه 18 اردیبهشت 1390, 12:26 عصر
راستی یه سوال دیگه اگه بخوایم حین اجرا برنامه یه کلید از کاربر بگیره بدون اینکه منتظر دریافتش باشه و بعد از تشخیص کلید مثلا جهتش رو تغییر بده باید چی کار کنیم؟

tdkhakpur
یک شنبه 18 اردیبهشت 1390, 15:36 عصر
راستی یه سوال دیگه اگه بخوایم حین اجرا برنامه یه کلید از کاربر بگیره بدون اینکه منتظر دریافتش باشه و بعد از تشخیص کلید مثلا جهتش رو تغییر بده باید چی کار کنیم؟
اگر اشتباه نکنم برای اینکه منتظر نمونید باید از تابع 1 وقفه 16h استفاده کنید.
از کد زیر برای کنترل کلیدهای جهت نما میشه استفاده کرد
.

getkey macro key
local exit_, jmp1
mov key, 0
mov ah, 1
int 16h
jz exit_ ; if buffer is empty jz else jnz
mov ah, 0 ; wait for pressed one key.
int 16h
cmp al, 0
je jmp1
mov byte ptr key, al
jmp exit_
jmp1:
mov byte ptr key, ah
add key , 1000
jmp exit_
exit_:
endm
;---------------------------------------------------
putstr macro buffer ;print string
mov ah,09h
mov dx,offset buffer
int 21h
endm
;---------------------------------------------------
stacksg segment para stack 'stack'
stacksg ends
datasg segment para 'data'
text db ' press esc to exit', '$'
text1 db ' [cursor down ] ', '$'
text2 db ' [cursor up ] ', '$'
text3 db ' [cursor left ] ', '$'
text4 db ' [cursor right]', '$'
text5 db ' esc ', '$'
buff db 255 dup(?)
key dw ?
datasg ends
codes segment para 'code'
main proc far
assume ss:stacksg, ds:datasg, cs:codes
mov ax, datasg
mov ds, ax
;------------ ur programm
putstr text
again:
getkey key
cmp key, 1080 ;----------; cursor down
jne check1 ;
putstr text1 ;
check1: ;----------;
cmp key, 1072 ;----------; cursor up
jne check2 ;
putstr text2 ;
check2: ;----------;
cmp key, 1075 ;----------; cursor left
jne check3 ;
putstr text3 ;
check3: ;----------;
cmp key, 1077 ;----------; cursor right
jne check4 ;
putstr text4 ;
check4: ;----------;
cmp key, 27
je exit_
jmp again
exit_:
;------------ end of program
mov ax, 4c00h
int 21h
main endp
codes ends
end main