|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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
复制代码
最终结果正确!
|
|