题目:任意三个数字相加,并输出结果


一、直接用寄存器做加法

A、B、C代表三个相加的数,D 代表和。
我们可以考虑:

ax=A=输入
bx=B=输入
cx=C=输入
dx=D=输出

dx=ax+bx+cx
mov ax,100
mov bx,200
mov cx,300 

add ax,bx
add ax,cx
mov dx,ax

End:
jmp near End

times 510 - ($ -$$) db 0x00
dw 0xAA55 ; 相当于 db 0x55,0xAA

二、使用内存存储数据做加法

上述代码虽然完成了功能实现,但是并不好,因为寄存器的数量是非常有限的。
一个程序稍微复杂点,很多地方都要使用寄存器,在一些不是非必要的前提下,我们尽量不要使用寄存器,而使用内存。

所以代码可以写成如下形式:

mov ax, 0x07C0
mov ds, ax
jmp near Code


Number1:
dw 100

Number2:
dw 200

Number3:
dw 300

Sum:
dw 0

Code:
mov ax, word[ds:Number1]
add ax, word[ds:Number2]
add ax, word[ds:Number3]
mov word[ds:Sum], ax


End:
jmp near End

times 510 - ($ -$$) db 0x00
dw 0xAA55 ; 相当于 db 0x55,0xAA

但这种写法,也有它的不好。
举个例子,现在要同时计算两组数字的求和。

100+200+300=600
400+500+600=1500

我们需要多复制一份上面的代码才能同时计算。

三、使用桟存数据做加法

还记得我们之前学过一个栈吗?栈里面一般存储一些临时的数据,我们能否用栈来实现上面这个程序呢?
当然可以了。

;ss:sp 栈顶, ss:bp 桟底

mov ax, 0x0000
mov ss, ax

mov sp, 0xFFFF
mov bp, 0xFFFF

;计算 100 + 200 + 300
push 100
push 200
push 300

mov ax, word[ss:bp - 2] ;ax=100
add ax, word[ss:bp - 4] ;ax=100+200
add ax, word[ss:bp - 6] ;ax=300+300
add sp, 6 ;桟是临时的内存,工作完成,就把sp重置到和bp桟底指针一样,清空桟


;-----------------------------------重复代码-------------------------

;计算 400 + 500 + 600
push 400
push 500
push 600

mov ax, word[ss:bp - 2] ;ax=400
add ax, word[ss:bp - 4] ;ax=400+500
add ax, word[ss:bp - 6] ;ax=900+600
add sp, 6 ;桟是临时的内存,工作完成,就把sp重置到和bp桟底指针一样,清空桟

End:
jmp near End

times 510 - ($ -$$) db 0x00
dw 0xAA55 ; 相当于 db 0x55,0xAA

但这个代码,依然有问题,重复的太多,不过以我们现在的能力还不具备优化的资格。
等我们后面再学习一些其他指令,回头来解决这个问题。