找回密码
 立即注册
搜索
热搜: 活动 通知
查看: 59|回复: 0

第8章习题

[复制链接]

621

主题

337

回帖

1061

积分

管理员

积分
1061
发表于 2026-3-15 09:32:24 | 显示全部楼层 |阅读模式
第8章习题

1.修改代码清单8-1的第31~37行,使用loop指令来计算累加和。要求:CX寄存器既用来控制循环次数,同时还用来作为被累加的数。
答:
         xor ax,ax
         mov cx,100
      @f:
         add ax, cx
         loop @f

2.在16位的处理器上,做加法的指令是add,但它每次只能做8位或16位的加法。除此之外,还有一个带进位加法指令adc(Add With Carry),它的指令格式和add一样,目的操作数可以是8位或16位的通用寄存器和内存单元,源操作数可以是与目的操作数宽度一致的通用寄存器、内存单元和立即数(但目的操作数和源操作数同为内存单元的除外)。不过,adc指令在执行的时候,除了将目的操作数和源操作数相加,还要加上当前标志寄存器的CF位。也就是说,视CF位的状态,还要再加0或者加1。这样一来,用adc指令配合add指令,就可以计算16位以上的加法。
adc指令对OF、SF、ZF、AF、CF和PF的影响视计算结果而定。
现在,请编写一段主引导扇区程序,计算1到1000的累加和,并在屏幕上显示结果。

参考答案:
         ;计算1到1000的累加和并打印

         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,1000
      @f:
         add ax, cx
         adc dx,0
         loop @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              ;从第二次相除时只用AX存放被除数
         cmp ax,0
         jne @d

         ;以下显示各个数位
     @a:
         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


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|鼠侠网 ( 吉ICP备19001332号 )

GMT+8, 2026-3-30 21:44 , Processed in 0.246450 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表