马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 兰陵月 于 2017-12-5 21:56 编辑 ;X86汇编语言-从实模式到保护模式,P112
;在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的累加和,并在屏幕上显示结果。
;文件名:P0112-2.asm
;文件创建日期:2017-10-27 12:47
jmp near start
message db '1+2+...+999+1000='
start:
mov ax,0x7c0
mov ds,ax
mov ax,0xb800
mov es,ax
;以下为显示message字符串内容
mov si,message
mov di,0
mov cx,start-message
@show:
mov al,[si]
mov [es:di],al
inc di
mov byte [es:di],0x07
inc di
inc si
loop @show
;求1~1000的和
xor ax,ax
xor dx,dx
mov cx,0x3e8
@hh:
add ax,cx
adc dx,0
loop @hh
;此时,和的高16位在DX中,低16位在AX。
;此处偷懒,不考虑除法溢出的问题(不是指除数为0的溢出)
;当然本题也不会产生除法溢出问题
xor cx,cx
mov ss,cx
mov sp,cx
mov bx,10
xor cx,cx
@gg:
inc cx
div bx
or dl,0x30
push dx
xor dx,dx
cmp ax,0
jne @gg
@show_1:
pop dx
mov [es:di],dl
inc di
mov byte [es:di],0x07
inc di
loop @show_1
jmp near $
times 510-($-$) db 0
db 0x55,0xaa
最终结果正确!
|