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 选项指定了忽略文件开头多少字节再反汇编,(红色字体)