ndisasm常用方法

 1 ;%define _BOOT_DEBUG_       ; 制作 Boot Sector 时一定将此行注释掉!
 2                 ; 去掉此行注释后可做成.COM文件易于调试:
 3                 ;   nasm Boot.asm -o Boot.com 
 4 
 5 %ifdef  _BOOT_DEBUG_
 6     org  0100h      ; 调试状态, 做成 .COM 文件, 可调试
 7 %else
 8     org  07c00h     ; BIOS 将把 Boot Sector 加载到 0:7C00 处
 9 %endif
10 
11     mov ax, cs
12     mov ds, ax
13     mov es, ax
14     call    DispStr     ; 调用显示字符串例程
15     jmp $       ; 无限循环
16 DispStr:
17     mov ax, BootMessage
18     mov bp, ax      ; ES:BP = 串地址
19     mov cx, 16      ; CX = 串长度
20     mov ax, 01301h  ; AH = 13,  AL = 01h
21     mov bx, 000ch   ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
22     mov dl, 0
23     int 10h     ; int 10h
24     ret 
25 BootMessage:        db  "Hello, OS world!"
26 times   510-($-$$)  db  0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
27 dw  0xaa55            ; 结束标志

nasm 编译成纯二进制文件 boot.bin

ndisasm不见任何选项直接反汇编的话,得到:

00000000  8CC8              mov ax,cs
00000002  8ED8              mov ds,ax
00000004  8EC0              mov es,ax
00000006  E80200            call word 0xb
00000009  EBFE              jmp short 0x9
0000000B  B81E7C            mov ax,0x7c1e
0000000E  89C5              mov bp,ax
00000010  B91000            mov cx,0x10
00000013  B80113            mov ax,0x1301
00000016  BB0C00            mov bx,0xc
00000019  B200              mov dl,0x0
0000001B  CD10              int 0x10
0000001D  C3                ret
0000001E  48                dec ax
0000001F  656C              gs insb
00000021  6C                insb
00000022  6F                outsw
00000023  2C20              sub al,0x20
00000025  4F                dec di
00000026  53                push bx
00000027  20776F            and [bx+0x6f],dh
0000002A  726C              jc 0x98
0000002C  642100            and [fs:bx+si],ax
0000002F  0000              add [bx+si],al
00000031  0000              add [bx+si],al

用ndisasm -o 0x7c00 反汇编得到:

00007C00  8CC8              mov ax,cs
00007C02  8ED8              mov ds,ax
00007C04  8EC0              mov es,ax
00007C06  E80200            call word 0x7c0b
00007C09  EBFE              jmp short 0x7c09
00007C0B  B81E7C            mov ax,0x7c1e
00007C0E  89C5              mov bp,ax
00007C10  B91000            mov cx,0x10
00007C13  B80113            mov ax,0x1301
00007C16  BB0C00            mov bx,0xc
00007C19  B200              mov dl,0x0
00007C1B  CD10              int 0x10
00007C1D  C3                ret
00007C1E  48                dec ax
00007C1F  656C              gs insb
00007C21  6C                insb
00007C22  6F                outsw
00007C23  2C20              sub al,0x20
00007C25  4F                dec di
00007C26  53                push bx
00007C27  20776F            and [bx+0x6f],dh
00007C2A  726C              jc 0x7c98
00007C2C  642100            and [fs:bx+si],ax
00007C2F  0000              add [bx+si],al
00007C31  0000              add [bx+si],al

用ndisasm -o 0x7c00 -e 4 反汇编得到:

00007C00  8EC0              mov es,ax
00007C02  E80200            call word 0x7c07
00007C05  EBFE              jmp short 0x7c05
00007C07  B81E7C            mov ax,0x7c1e
00007C0A  89C5              mov bp,ax
00007C0C  B91000            mov cx,0x10
00007C0F  B80113            mov ax,0x1301
00007C12  BB0C00            mov bx,0xc
00007C15  B200              mov dl,0x0
00007C17  CD10              int 0x10
00007C19  C3                ret
00007C1A  48                dec ax
00007C1B  656C              gs insb
00007C1D  6C                insb
00007C1E  6F                outsw
00007C1F  2C20              sub al,0x20
00007C21  4F                dec di
00007C22  53                push bx
00007C23  20776F            and [bx+0x6f],dh
00007C26  726C              jc 0x7c94
00007C28  642100            and [fs:bx+si],ax
00007C2B  0000              add [bx+si],al
00007C2D  0000              add [bx+si],al

 

综上:-o 选项指定了反汇编的起始地址,(第一列加粗的地址)

   -e 选项指定了忽略文件开头多少字节再反汇编,(红色字体)

posted on 2013-09-25 13:57  莫扎特也是程序猿  阅读(1832)  评论(0编辑  收藏  举报

导航