[Asm] 纯文本查看 复制代码
stack segment stack ; 定义堆栈段
dw 100 dup(?) ;堆栈段长100字节, 这里db就是字节的意思,如果是用dw就是字,100 dup(?) 中的dup是重复的意思,这句话是重复100遍,一遍定义一个字节,每个字节里全填0
stack ends
data segment
iptplz db 'Input the fuck to calc:', 13, 10, '$'
next db 13, 10, '$'
lastdx dw 8 dup(0)
data ends
code segment
assume ss:stack, ds:data, cs:code
start:
mov ax, data
mov ds, ax
;显示提示信息
lea dx, iptplz
mov ah, 09h
int 21h
xor cx, cx
push cx;用cx储存当前的计算结果,初始02016-3-14
lea si, lastdx
mov [si], 01;首先视为+号
mov [si+2], 0;标志位,如果不为0了,执行输出
lopcalc:
call inputnum
cmp dx, 03
jnz todeal
mov [si+2], 1
todeal:
lea si, lastdx
mov ax, dx
mov dx, [si]
mov [si], ax;取出上一个符号进行计算
pop cx
cmp dx, 01
jz doadd
cmp dx, 02
jz dosub
;如果是等号,显示结果并换行重新开始
doadd:
add cx, bx
push cx
jmp finidocalc
dosub:
sub cx, bx
push cx
jmp finidocalc
finidocalc:
cmp [si+2], 0
jz lopcalc
mov ax, cx
call showint
jmp start
;处理用户输入
jmp fini
showint proc;显示数字函数
cmp ax, 0;0直接输出
jnz notzero
mov dx, '0'
mov ah, 02h
int 21h
jmp endshow
notzero:
xor cx, cx;cx表示位数,初始为0
pushtostack:
xor dx, dx;被除数是dx和ax的组合。。。不清空会溢出
mov bx, 10
div bx
add dx, '0'
push dx
inc cx
cmp ax, 0
jz popandshow
jmp pushtostack
popandshow:
mov ah, 02h
pop dx
int 21h
loop popandshow
endshow:
mov ah, 09h
lea dx, next
int 21h
ret
showint endp
inputnum proc;输入数字函数(这里的函数比较简单,没有涉及堆栈)
mov bx, 0;先把bx置0
loop1:
mov ah, 01h;调用输入一个字符
int 21h
cmp al, '+'; 加号返回
jz exadd
cmp al, '-'; 减号返回
jz exsub
cmp al, '='; 等号返回
jz exout
cmp al, 13 ; 回车返回并输出等号
jz exoutmore
cmp al, 'X'; X号退出
jz fini
sub al, 30h;输入进入al,减去30h是减去’0’
xor ah, ah;ah置0,使ax等于al
xchg ax, cx; 新输入的储存在cx中
mov ax, bx;原有的数在bx,移动到ax中
mov bx, 10;bx置10
mul bx;bx乘以ax(10乘以ax)结果在ax中
add ax, cx;ax=原有的数*10+新输入的数字
mov bx, ax;bx=ax
jmp loop1;循环执行
toexit:
ret;返回
exadd:
mov dx, 01
ret
exsub:
mov dx, 02
ret
exout:
mov dx, 03
ret
exoutmore:
lea dx, next
mov ah, 09h
int 21h
mov ah, 02h
mov dx, 61
int 21h
mov dx, 03
ret
inputnum endp
fini:
mov ah, 01h
int 21h
mov ah, 4ch
int 21h
code ends
end start