[007][x86汇编语言]计算1+2+...+1000= 50
2018-05-20 本文已影响0人
AkuRinbu
求和结果 s = sum(1:1000) = 500500

第7章 习题2 e7-2.asm :使用带进位加法指令 adc求解1+2...1000的和
;代码清单
;文件名:e7-2.asm
;文件说明:硬盘主引导扇区代码
;创建日期:12:07 2018/5/21
jmp near start
message db '1+2+3+...+1000='
start:
mov ax,0x7c0 ;设置数据段的段基地址
mov ds,ax
mov ax,0xb800 ;设置附加段基址到显示缓冲区
mov es,ax
;以下显示字符串
mov si,message
mov di,0
mov cx,start-message
@g:
mov al,[si]
mov [es:di],al
inc di
mov byte [es:di],0x07
inc di
inc si
loop @g
;以下计算1到1000的和
xor ax,ax
xor dx,dx
mov cx,1
@f:
add ax,cx
adc dx,0
inc cx
cmp cx,1000
jle @f
;以下计算累加和的每个数位
xor cx,cx ;设置堆栈段的段基地址
mov ss,cx
mov sp,cx
mov bx,10
xor cx,cx ;清零,以记录有多少个数位
@d:
inc cx
div bx
or dl,0x30
push dx
xor dx,dx
cmp ax,0
jne @d
;以下显示各个数位
@a: ; 使用上面记录的CX
pop dx
mov [es:di],dl ; 接着 = 继续输出到显存
inc di
mov byte [es:di],0x07
inc di
loop @a
jmp near $
times 510-($-$$) db 0
db 0x55,0xaa
运行结果


代码说明
- 参考配书代码
c07_mbr.asm
显示成加和到1000
message db '1+2+3+...+1000='
其余参考 图片 第7章 习题e7-2.asm.png 粉色框内
-
push ax
等价于
sub sp,2
mov bx,sp
mov [ss:bp],ax
-
pop ax
等价于
mov bx,sp
mov ax,[ss:bx]
add sp,2
- adc 带进位加法
- div 有符号数除法
- 为什么是
or dl,0x30
?
or dl,0x30
push dx
-------------------------------
32位÷16位
DX |AX
计算前 高16位 |低16位
除法后 余数 |商
除以10,余数只会是0~9
假设余数是5,
or dl,0x30
0000 0101
or 0011 0000
-----------------------
0011 0101 = 0x35
本质等于 dl + 0x35
DX= 0x 00 35
Intel 8086 push 操作只能push16位 寄存器
所以要用 push dx