<x86汇编语言 从实模式到保护模式>配套汇编代码不理解

新手上路,请多包涵

这是配套代码:

;代码清单5-1 
     ;文件名:c05_mbr.asm
     ;文件说明:硬盘主引导扇区代码
     ;创建日期:2011-3-31 21:15 
     
     mov ax,0xb800                 ;指向文本模式的显示缓冲区
     mov es,ax

     ;以下显示字符串"Label offset:"
     mov byte [es:0x00],'L'
     mov byte [es:0x01],0x07
     mov byte [es:0x02],'a'
     mov byte [es:0x03],0x07
     mov byte [es:0x04],'b'
     mov byte [es:0x05],0x07
     mov byte [es:0x06],'e'
     mov byte [es:0x07],0x07
     mov byte [es:0x08],'l'
     mov byte [es:0x09],0x07
     mov byte [es:0x0a],' '
     mov byte [es:0x0b],0x07
     mov byte [es:0x0c],"o"
     mov byte [es:0x0d],0x07
     mov byte [es:0x0e],'f'
     mov byte [es:0x0f],0x07
     mov byte [es:0x10],'f'
     mov byte [es:0x11],0x07
     mov byte [es:0x12],'s'
     mov byte [es:0x13],0x07
     mov byte [es:0x14],'e'
     mov byte [es:0x15],0x07
     mov byte [es:0x16],'t'
     mov byte [es:0x17],0x07
     mov byte [es:0x18],':'
     mov byte [es:0x19],0x07

     mov ax,number                 ;取得标号number的偏移地址
     mov bx,10

     ;设置数据段的基地址
     mov cx,cs
     mov ds,cx

     ;求个位上的数字
     mov dx,0
     div bx
     mov [0x7c00+number+0x00],dl   ;保存个位上的数字

     ;求十位上的数字
     xor dx,dx
     div bx
     mov [0x7c00+number+0x01],dl   ;保存十位上的数字
     ;求百位上的数字
     xor dx,dx
     div bx
     mov [0x7c00+number+0x02],dl   ;保存百位上的数字

     ;求千位上的数字
     xor dx,dx
     div bx
     mov [0x7c00+number+0x03],dl   ;保存千位上的数字

     ;求万位上的数字 
     xor dx,dx
     div bx
     mov [0x7c00+number+0x04],dl   ;保存万位上的数字

     ;以下用十进制显示标号的偏移地址
     mov al,[0x7c00+number+0x04]
     add al,0x30
     mov [es:0x1a],al
     mov byte [es:0x1b],0x04
     
     mov al,[0x7c00+number+0x03]
     add al,0x30
     mov [es:0x1c],al
     mov byte [es:0x1d],0x04
     
     mov al,[0x7c00+number+0x02]
     add al,0x30
     mov [es:0x1e],al
     mov byte [es:0x1f],0x04

     mov al,[0x7c00+number+0x01]
     add al,0x30
     mov [es:0x20],al
     mov byte [es:0x21],0x04

     mov al,[0x7c00+number+0x00]
     add al,0x30
     mov [es:0x22],al
     mov byte [es:0x23],0x04
     
     mov byte [es:0x24],'D'
     mov byte [es:0x25],0x07
      
   infi: jmp near infi                 ;无限循环
  
  number db 0,0,0,0,0

  times 203 db 0
        db 0x55,0xaa

请问代码中"设置数据段的基地址" 把cs的数据赋值给ds有什么用呢 cs和ds都是0x00;

阅读 3.9k
3 个回答
新手上路,请多包涵

兄弟,后面取数据的时候我想问你基地址是多少,你写的是偏移值,懂不,所以需要设置数据基地址

@hello2world 说的对,但是没有对代码进行解释,那我就来说两句。
代码如下:

 ;设置数据段的基地址
 mov cx,cs
 mov ds,cx

 ;求个位上的数字
 mov dx,0
 div bx
 mov [0x7c00+number+0x00],dl   ;保存个位上的数字

第8行的mov指令目的操作数[0x7c00+number+0x00]中括号内指定是内存单元的段内偏移量,相对的段基地址默认使用ds寄存器,所以在这行代码前需要先设置好ds。将csds设置成一样,是因为数据和代码段是共用的。区别与这种写法的是mov byte [es:0x00],'L',使用段超越前缀,基地址使用es寄存器。

都没人会汇编啊

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进