|
|
第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
|
|