nasm生成list和bin文件并进行分析

1.源代码

         ;代码清单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

2. 生成.lst文件和bin文件

nasm c05_mbr.asm -l c05_mbr.lst -o c05_mbr.bin

2.1 .lst文件分析

从左到右,分别对应:行号/汇编地址/机器指令/汇编代码

     1                                           ;代码清单5-1 
     2                                           ;文件名:c05_mbr.asm
     3                                           ;文件说明:硬盘主引导扇区代码
     4                                           ;创建日期:2011-3-31 21:15 
     5                                           
     6 00000000 B800B8                           mov ax,0xb800                 ;指向文本模式的显示缓冲区
     7 00000003 8EC0                             mov es,ax
     8                                  
     9                                           ;以下显示字符串"Label offset:"
    10 00000005 26C60600004C                     mov byte [es:0x00],'L'
    11 0000000B 26C606010007                     mov byte [es:0x01],0x07
    12 00000011 26C606020061                     mov byte [es:0x02],'a'
    13 00000017 26C606030007                     mov byte [es:0x03],0x07
    14 0000001D 26C606040062                     mov byte [es:0x04],'b'
    15 00000023 26C606050007                     mov byte [es:0x05],0x07
    16 00000029 26C606060065                     mov byte [es:0x06],'e'
    17 0000002F 26C606070007                     mov byte [es:0x07],0x07
    18 00000035 26C60608006C                     mov byte [es:0x08],'l'
    19 0000003B 26C606090007                     mov byte [es:0x09],0x07
    20 00000041 26C6060A0020                     mov byte [es:0x0a],' '
    21 00000047 26C6060B0007                     mov byte [es:0x0b],0x07
    22 0000004D 26C6060C006F                     mov byte [es:0x0c],"o"
    23 00000053 26C6060D0007                     mov byte [es:0x0d],0x07
    24 00000059 26C6060E0066                     mov byte [es:0x0e],'f'
    25 0000005F 26C6060F0007                     mov byte [es:0x0f],0x07
    26 00000065 26C606100066                     mov byte [es:0x10],'f'
    27 0000006B 26C606110007                     mov byte [es:0x11],0x07
    28 00000071 26C606120073                     mov byte [es:0x12],'s'
    29 00000077 26C606130007                     mov byte [es:0x13],0x07
    30 0000007D 26C606140065                     mov byte [es:0x14],'e'
    31 00000083 26C606150007                     mov byte [es:0x15],0x07
    32 00000089 26C606160074                     mov byte [es:0x16],'t'
    33 0000008F 26C606170007                     mov byte [es:0x17],0x07
    34 00000095 26C60618003A                     mov byte [es:0x18],':'
    35 0000009B 26C606190007                     mov byte [es:0x19],0x07
    36                                  
    37 000000A1 B8[2E01]                         mov ax,number                 ;取得标号number的偏移地址
    38 000000A4 BB0A00                           mov bx,10
    39                                  
    40                                           ;设置数据段的基地址
    41 000000A7 8CC9                             mov cx,cs
    42 000000A9 8ED9                             mov ds,cx
    43                                  
    44                                           ;求个位上的数字
    45 000000AB BA0000                           mov dx,0
    46 000000AE F7F3                             div bx
    47 000000B0 8816[2E7D]                       mov [0x7c00+number+0x00],dl   ;保存个位上的数字
    48                                  
    49                                           ;求十位上的数字
    50 000000B4 31D2                             xor dx,dx
    51 000000B6 F7F3                             div bx
    52 000000B8 8816[2F7D]                       mov [0x7c00+number+0x01],dl   ;保存十位上的数字
    53                                  
    54                                           ;求百位上的数字
    55 000000BC 31D2                             xor dx,dx
    56 000000BE F7F3                             div bx
    57 000000C0 8816[307D]                       mov [0x7c00+number+0x02],dl   ;保存百位上的数字
    58                                  
    59                                           ;求千位上的数字
    60 000000C4 31D2                             xor dx,dx
    61 000000C6 F7F3                             div bx
    62 000000C8 8816[317D]                       mov [0x7c00+number+0x03],dl   ;保存千位上的数字
    63                                  
    64                                           ;求万位上的数字 
    65 000000CC 31D2                             xor dx,dx
    66 000000CE F7F3                             div bx
    67 000000D0 8816[327D]                       mov [0x7c00+number+0x04],dl   ;保存万位上的数字
    68                                  
    69                                           ;以下用十进制显示标号的偏移地址
    70 000000D4 A0[327D]                         mov al,[0x7c00+number+0x04]
    71 000000D7 0430                             add al,0x30
    72 000000D9 26A21A00                         mov [es:0x1a],al
    73 000000DD 26C6061B0004                     mov byte [es:0x1b],0x04
    74                                           
    75 000000E3 A0[317D]                         mov al,[0x7c00+number+0x03]
    76 000000E6 0430                             add al,0x30
    77 000000E8 26A21C00                         mov [es:0x1c],al
    78 000000EC 26C6061D0004                     mov byte [es:0x1d],0x04
    79                                           
    80 000000F2 A0[307D]                         mov al,[0x7c00+number+0x02]
    81 000000F5 0430                             add al,0x30
    82 000000F7 26A21E00                         mov [es:0x1e],al
    83 000000FB 26C6061F0004                     mov byte [es:0x1f],0x04
    84                                  
    85 00000101 A0[2F7D]                         mov al,[0x7c00+number+0x01]
    86 00000104 0430                             add al,0x30
    87 00000106 26A22000                         mov [es:0x20],al
    88 0000010A 26C606210004                     mov byte [es:0x21],0x04
    89                                  
    90 00000110 A0[2E7D]                         mov al,[0x7c00+number+0x00]
    91 00000113 0430                             add al,0x30
    92 00000115 26A22200                         mov [es:0x22],al
    93 00000119 26C606230004                     mov byte [es:0x23],0x04
    94                                           
    95 0000011F 26C606240044                     mov byte [es:0x24],'D'
    96 00000125 26C606250007                     mov byte [es:0x25],0x07
    97                                            
    98 0000012B E9FDFF                     infi: jmp near infi                 ;无限循环
    99                                        
   100 0000012E 0000000000                number db 0,0,0,0,0
   101                                    
   102 00000133 00<rept>                  times 203 db 0
   103 000001FE 55AA                                db 0x55,0xaa

1.当编译好的程序加载到物理内存后,它在段内的偏移地址和它在编译阶段的汇编地址是相等的

2.因为源程序的编译是从上往下的,而内存地址的增长是从下往 上的(从低地址往高地址方向增长),所以箭头交叉,如下图

2.2 汇编代码对应机器指令

汇编代码:
mov ax,0xb800  
B800B8                                        

B8:表示指令mov ax
00B8:是操作数,对应0xb800,只不过是按照先写低位字节,再写高位,所有0xb800,对应00b8

在这里插入图片描述

3.分析bin文件

这个bin文件为MBR主引导扇区代码,占512Byte,最后以55AA结束来标志

Master Boot Record:是硬盘的第一个扇区,即C/H/S地址的0柱面0磁头1扇区,也叫做MBR扇区

3.1 加载MBR流程

BIOS开机自检—BIOS加载MBR—至内存物理地址0x7c00处—BIOS程序跳转至0x7c00处开始执行代码

  Offset: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 
  
00000000: B8 00 B8 8E C0 26 C6 06 00 00 4C 26 C6 06 01 00    8.8.@&F...L&F...
00000010: 07 26 C6 06 02 00 61 26 C6 06 03 00 07 26 C6 06    .&F...a&F....&F.
00000020: 04 00 62 26 C6 06 05 00 07 26 C6 06 06 00 65 26    ..b&F....&F...e&
00000030: C6 06 07 00 07 26 C6 06 08 00 6C 26 C6 06 09 00    F....&F...l&F...
00000040: 07 26 C6 06 0A 00 20 26 C6 06 0B 00 07 26 C6 06    .&F....&F....&F.
00000050: 0C 00 6F 26 C6 06 0D 00 07 26 C6 06 0E 00 66 26    ..o&F....&F...f&
00000060: C6 06 0F 00 07 26 C6 06 10 00 66 26 C6 06 11 00    F....&F...f&F...
00000070: 07 26 C6 06 12 00 73 26 C6 06 13 00 07 26 C6 06    .&F...s&F....&F.
00000080: 14 00 65 26 C6 06 15 00 07 26 C6 06 16 00 74 26    ..e&F....&F...t&
00000090: C6 06 17 00 07 26 C6 06 18 00 3A 26 C6 06 19 00    F....&F...:&F...
000000a0: 07 B8 2E 01 BB 0A 00 8C C9 8E D9 BA 00 00 F7 F3    .8..;...I.Y:..ws
000000b0: 88 16 2E 7D 31 D2 F7 F3 88 16 2F 7D 31 D2 F7 F3    ...}1Rws../}1Rws
000000c0: 88 16 30 7D 31 D2 F7 F3 88 16 31 7D 31 D2 F7 F3    ..0}1Rws..1}1Rws
000000d0: 88 16 32 7D A0 32 7D 04 30 26 A2 1A 00 26 C6 06    ..2}.2}.0&"..&F.
000000e0: 1B 00 04 A0 31 7D 04 30 26 A2 1C 00 26 C6 06 1D    ....1}.0&"..&F..
000000f0: 00 04 A0 30 7D 04 30 26 A2 1E 00 26 C6 06 1F 00    ...0}.0&"..&F...
00000100: 04 A0 2F 7D 04 30 26 A2 20 00 26 C6 06 21 00 04    ../}.0&"..&F.!..
00000110: A0 2E 7D 04 30 26 A2 22 00 26 C6 06 23 00 04 26    ..}.0&"".&F.#..&
00000120: C6 06 24 00 44 26 C6 06 25 00 07 E9 FD FF 00 00    F.$.D&F.%..i}...
00000130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
00000140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
00000150: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
00000160: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
00000170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
00000180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
00000190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
000001a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
000001b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
000001c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
000001d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
000001e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
000001f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA    ..............U*

奋斗的目标

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值