美文网首页
[007][x86汇编语言]计算1+2+...+1000= 50

[007][x86汇编语言]计算1+2+...+1000= 50

作者: AkuRinbu | 来源:发表于2018-05-20 12:20 被阅读0次

求和结果 s = sum(1:1000) = 500500

s = sum(1:1000) = 500500

https://octave-online.net

第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

运行结果

第7章 习题e7-1.asm.png 第7章 习题e7-2.asm.png

代码说明

  • 参考配书代码 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 带进位加法

https://www.jianshu.com/p/f7f90d405bf3

  • div 有符号数除法

https://www.jianshu.com/p/211cf4edd4d3

  • 为什么是 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

相关文章

网友评论

      本文标题:[007][x86汇编语言]计算1+2+...+1000= 50

      本文链接:https://www.haomeiwen.com/subject/rqefjftx.html