spdv123 发表于 2016-3-14 11:32

【源码】汇编学习笔记(二)

这次的程序是个简陋的计算器,感觉一开始处理方法就选的不好(用字符串模拟按位处理会简单些),没法支持负数,代码又长,调试了一上午,感觉注释得比较清楚了,自我勉励一下~
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 , 01;首先视为+号
        mov , 0;标志位,如果不为0了,执行输出
lopcalc:
        call inputnum
        cmp dx, 03
        jnz todeal
        mov , 1
todeal:
        lea si, lastdx
        mov ax, dx
        mov dx,
        mov , 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 , 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
( •̀ ω •́ )y再附张图片:
(图片上传不上去。。。Error302谁知道怎么破)

牧尘大日 发表于 2016-3-14 12:00

感谢楼主分享

默默黎明 发表于 2016-3-14 12:15

感谢楼主分享

xiaopan7881 发表于 2016-3-14 17:04

感谢楼主分享

Pepper 发表于 2016-3-14 17:58

谢谢楼主分享

Fmd1988 发表于 2016-3-14 20:36

感谢楼主分享

先谢郭嘉 发表于 2016-3-15 08:21

感谢楼主分享

smile初恋 发表于 2016-3-15 10:42

楼主好样的。。。

cunese 发表于 2016-3-15 22:41

今天买了本汇编语言。从挖掘机向计算机转型。共勉。

tooo 发表于 2016-3-16 10:42

好长时间不看,都忘了。楼主加油。
页: [1] 2
查看完整版本: 【源码】汇编学习笔记(二)