PDA

View Full Version : توضیح کد ماشین حساب و تشخیص ماکرو بودن آن



modern_amin
شنبه 15 بهمن 1390, 16:25 عصر
سلام دوستان
میشه در مورد این کد (ماشین حساب)به من مقداری توضیح بدید و بگید چطوری میشه استفاده از ماکرو رو تو این کد فهمید که استفاده شده یا نه؟ (واقعا ممنون میشم)
.

.model small
include MAC1.lib
include string.lib
stack segment stack
dw 128 dup(?)
stack ends
datasg segment 'data'
op db 0 ;variant operation
op1 db ?
x dw 0
sum dw 0
m db 0
s db 0
h db 4
a db ?
d db ?
st1 db ?,'$'
stce db 'CE','$'
stsum db 8 dup(?),'$'

stcls db 8 dup(' '),'$'

stcan db 'Cannot Div by Zero.','$'
datasg ends
codesg segment 'code'
main proc far
init1
gotoxy1 4,3
putch1 '0'
fir: wincalc stce
;*********************jmp to part any btn*******************************
cmp m,0
jz lce
cmp m,1
jz num0
cmp m,2
jz ope5 ;ope5 = '='
cmp m,3
jz ope3 ;ope3 = '/'
cmp m,4
jz num1
cmp m,5
jz num2
cmp m,6
jz num3
cmp m,7
jz ope4 ;ope4 = '*'
cmp m,8
jz num4
cmp m,9
jz num5
cmp m,10
jz num6
cmp m,11
jz ope2 ;ope2 = '-'
cmp m,12
jz num7
cmp m,13
jz num8
cmp m,14
jz num9
cmp m,15
jz ope1 ;ope1 = '+'
;****************************************selected btn selects*************************
num0: window1 8,22,11,25,14h ;num0
mov a,0
gotoxy1 9,23
putch1 '0'
jmp endl

num1: window1 3,17,6,20,14h ;num1
mov a,1
gotoxy1 4,18
putch1 '1'
jmp endl
num2: window1 8,17,11,20,14h ;num2
mov a,2
gotoxy1 9,18
putch1 '2'
jmp endl
num3: window1 13,17,16,20,14h ;num3
mov a,3
gotoxy1 14,18
putch1 '3'
jmp endl

num4: window1 3,12,6,15,14h ;num4
mov a,4
gotoxy1 4,13
putch1 '4'
jmp endl
num5: window1 8,12,11,15,14h ;num5
mov a,5
gotoxy1 9,13
putch1 '5'
jmp endl
num6: window1 13,12,16,15,14h ;num6
mov a,6
gotoxy1 14,13
putch1 '6'
jmp endl

num7: window1 3,7,6,10,14h
mov a,7
gotoxy1 4,8
putch1 '7'
jmp endl

num8: window1 8,7,11,10,14h
mov a,8
gotoxy1 9,8
putch1 '8'
jmp endl

num9: window1 13,7,16,10,14h
mov a,9
gotoxy1 14,8
putch1 '9'
jmp endl

ope1: window1 18,7,21,10,14h ;bnt +
gotoxy1 19,8
putch1 '+'
jmp endl
ope2: window1 18,12,21,15,14h ;btn -
gotoxy1 19,13
putch1 '-'
jmp endl
ope3: window1 18,22,21,25,14h ;ope /
gotoxy1 19,23
putch1 '/'
jmp endl
ope4: window1 18,17,21,20,14h ;btn *
gotoxy1 19,18
putch1 '*'
jmp endl
ope5: window1 13,22,16,25,14h ;ope =
gotoxy1 14,23
putch1 '='
jmp endl

lce: window1 3,22,6,25,14h ;btn ce
gotoxy1 4,23
puts1 stce
jmp endl

endl: strcpy stsum
gotoxy1 14,3
itoa1 x,stsum
puts1 stsum
puts1 stcls

;***************************************read any kay******************
lre: mov ah,0h
int 16h ;Read a Char

cmp al,27 ;Press 'ESC'
jz p0
cmp al,13 ;Press 'Enter'
jz lsec
cmp al,0 ;Press 'Arrow'
jz laro
cmp al,0eh
jz laro
jmp lre

;*************************************check for press why key**********************
lsec: cmp m,0
mov op,0 ;op='CE'
jz wop
cmp m,2
mov op,1 ;op='='
jz wop
cmp m,3
mov op,2 ;op='/'
jz wop
cmp m,7
mov op,3 ;op='*'
jz wop
cmp m,11
mov op,4 ;op='-'
jz wop
cmp m,15
mov op,5 ;op='+'
jz wop
jmp wdi

laro: cmp ah,80 ;Press 'Arrow Down'
jz down1
cmp ah,72 ;Press 'Arrow Up'
jz up1
cmp ah,77 ;Press 'Arrow Right'
jz right1
cmp ah,75 ;Press 'Arrow Left'
jz left1

;*************************************arrow******* **************************
down1: cmp m,0
jge down2
jmp down_1
down2: cmp m,3
jg down_1
add m,12
jmp enddown
down_1: sub m,4
enddown:jmp fir

up1: cmp m,12
jge up2
jmp up_1
up2: cmp m,15
jg up_1
sub m,12
jmp enddown
up_1: add m,4
endup:jmp fir

right1: cmp m,15
jnz right2
mov m,0
jmp endright
right2: inc m
jmp endright
right_1:sub m,4
endright:jmp fir

left1: cmp m,0
jnz left2
mov m,15
jmp endleft
left2: dec m
jmp endleft
left_1:sub m,4
endleft:jmp fir

jmp p0
;****************************************write number in digit***************
wdi:
inc h
nummul x
mov al,a
mov ah,0
add x,ax
; jmp endwdi
endwdi: jmp endl
;***************************************write ope**************************
wop: cmp s,0 ;if s==0 yani hanoz adadi dar sum zakhireh nashodeh
jz wop2
cmp op,1
jnz w1
jmp wo0
l1: mov s,0
jmp fir
w1: cmp op,0
jnz endw
mov s,0
mov m,0
mov a,0
mov x,0h
mov sum,0
mov op1,0
jmp fir
wop2: mov s,1
mov ax,x
mov sum,ax
mov al,op
mov op1,al
mov x,0h
window1 3,2,21,5,24h
endw: jmp fir
;*****************************************jmp to continue code*******************

;*************************************operation*** ****************
wo0: cmp op1,2 ;op='/'
jnz wo1
cmp x,0
jz err
mov ax,sum
mov cx,x
div cl
mov ah,0
mov sum,ax
mov x,ax
jmp endw1
err: gotoxy1 14,3
puts1 stcan
jmp endw1
wo1: cmp op1,3 ;op='*'
jnz wo2
mov ax,sum
mul x
mov sum,ax
mov x,ax
jmp endw1
wo2: cmp op1,4 ;op='-'
jnz wo3
mov cx,sum
mov ax,x
sub cl,al
sbb ch,ah
mov sum,cx
mov x,cx
jmp endw1
wo3: cmp op1,5 ;op='+'
jnz endw1
mov ax,x
mov cx,sum
add al,cl
adc ah,ch
mov sum,ax
mov x,ax

endw1: strcpy stsum
gotoxy1 14,3
itoa1 x,stsum
puts1 stsum
gotoxy1 3,3
puts1 stcls
getch2
getch2
mov op,0
jmp wop
;************************************************* ****************
p0:

exit: exit1
main endp
codesg ends
end main

xman_1365_x
دوشنبه 08 اسفند 1390, 03:09 صبح
وقتی خطی دیدین که جز دستورالعمل های 8086 نیست میتونه ماکرو باشه مثل init1 و gotoxy1 4,3 که این ماکرو ها در این فایل تعریف نشده و توسط include که در فایل MAC1.lib نوشته شده به برنامه اضافه شده