兰陵月 发表于 2017-10-27 19:08:09

X86汇编语言-从实模式到保护模式—笔记(5)

本帖最后由 兰陵月 于 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,
          mov ,al
          inc di
          mov byte ,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 ,dl
          inc di
          mov byte ,0x07
          inc di
          loop @show_1


          jmp near $

times 510-($-$) db 0
                   db 0x55,0xaa

最终结果正确!
页: [1]
查看完整版本: X86汇编语言-从实模式到保护模式—笔记(5)