四十五、三数求和并输出
题目:任意三个数字相加,并输出结果
一、直接用寄存器做加法
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
但这个代码,依然有问题,重复的太多,不过以我们现在的能力还不具备优化的资格。
等我们后面再学习一些其他指令,回头来解决这个问题。