nasm的汇编和反汇编
步骤:
1. 汇编(boot.asm为boot.bin)
nasm boot.asm -o boot.bin
2. 反汇编(boot.bin为disboot.asm)
ndisasm -o 0x7C00 boot.bin >> disboot.asm
注:nasm和ndisasm工具都是nasm的组件:)
****************************************************************************
"boot.asm"文件:
org 07c00h ; 告诉编译器程序加载到7c00处(见下面解释) mov ax, cs mov ds, ax mov es, ax call DispStr ; 调用显示字符串例程 jmp $ ; 无限循环 DispStr: mov ax, BootMessage mov bp, ax ; ES:BP = 串地址 mov cx, 16 ; CX = 串长度 mov ax, 01301h ; AH = 13, AL = 01h mov bx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮) mov dl, 0 int 10h ; 10h 号中断 (这是BIOS中断,功能号AH=13表示“从指定位置起显示字符 串”,详见附件) ret BootMessage: db "Hello, OS world!" times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节 dw 0xaa55 ; 结束标志
为什么要org 07c00h?
有很多人看了"自己动手写操作系统"或其第二版这本书后对这一行提出疑问.
这个问题在书中作者的解释是:
告诉编译器,将来我们的这段程序要被加载到07c00处执行.
我们知道编译器本身在汇编时对指令的地址计算的是相对地址.而对于引导扇区,一切只是从无生有的
阶段,是按绝对地址执行.那么对于用相对地址编译的执行码就要换算成绝对地址.
一般而言,"真实开始执行的引导扇区"都会固定装载到07c00处,主意这句话是说一个真正的引导扇区.
对于硬盘上,会有一个主引导扇区,然后由它来控制和其它引导扇区,比如grub控制windows,linux等.
那么这个主引导扇区会加载在0600h处,当选择其它可引导扇区时再将真正的可引导扇区加载到07c00h.
所以一般而言真正的可引导扇区都装载到07c00h处.
因为编译器在编译时的地址是从第一行开始用0000h开始相对计算的.假如我们定义一个str: dw "zxy"
它的相对地址是0100h,如果我们mov ax str那么就是将0100h传给ax,这在编译后的执行码中是固定的.
而引导扇区是使用绝对地址执行的,指令从07c00h处开始执行,那么访问0100h绝对是错误的访问.真实
的绝对地址是07c00h+0100h,所以如果你不写org 07c00h,把mov ax str写成mov ax str+07c00h对于
传址操作是一样的目的.对于作者的那段程序可以去掉第一行的org 07c00h.把"mov ax,BootMessage"
改成"mov ax,BootMessage+07c00h",效果是一样的.
但是如果有大量的传址操作,那就要在每个地方都要+07c00h,那是一件非常头痛的事.
所以在第一行加上org 07c00h只是让编译器从相对地址org 07c00h处开始编译第一条指令,那么下面的
相对地址被编译加载后就正好和绝对地址吻合.
****************************************************************************
"disboot.asm"文件:
//ndisasm -o 0x7c00 boot.bin >> disboot.asm //下面是反汇编boot.bin得到的disboot.asm文件: //1. 程序框架 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 //2. 显示字符串子例程 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 //3. 0x7C1E~0x7c2D中存放字符串"Hello, OS world!",下面其实不是指令:)而是数据 //0x48: 'H' //0x656C: 'e''l' //... //0x642100: 'd''!' 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 //4. 剩余部分填充0 // 510-($-$$)=510-(0x7C2F-0x7C00)=510-0x2F=510-47=463, //即,从0x7C2F开始(包括0x7C2F)需要填充463个字节 //1)下面类似**** 0000 add [bx+si],al一共有231行,也即462个bytes(每个byte都是0x00) //2)还差一个字节0x00,这个字节应该放到7DFD字节单元中——这是通过最后一条指令 // 00007DFD 0055AA add [di-0x56],dl完成的 00007C2F 0000 add [bx+si],al 00007C31 0000 add [bx+si],al 00007C33 0000 add [bx+si],al 00007C35 0000 add [bx+si],al 00007C37 0000 add [bx+si],al 00007C39 0000 add [bx+si],al 00007C3B 0000 add [bx+si],al 00007C3D 0000 add [bx+si],al 00007C3F 0000 add [bx+si],al 00007C41 0000 add [bx+si],al 00007C43 0000 add [bx+si],al 00007C45 0000 add [bx+si],al 00007C47 0000 add [bx+si],al 00007C49 0000 add [bx+si],al 00007C4B 0000 add [bx+si],al 00007C4D 0000 add [bx+si],al 00007C4F 0000 add [bx+si],al 00007C51 0000 add [bx+si],al 00007C53 0000 add [bx+si],al 00007C55 0000 add [bx+si],al 00007C57 0000 add [bx+si],al 00007C59 0000 add [bx+si],al 00007C5B 0000 add [bx+si],al 00007C5D 0000 add [bx+si],al 00007C5F 0000 add [bx+si],al 00007C61 0000 add [bx+si],al 00007C63 0000 add [bx+si],al 00007C65 0000 add [bx+si],al 00007C67 0000 add [bx+si],al 00007C69 0000 add [bx+si],al 00007C6B 0000 add [bx+si],al 00007C6D 0000 add [bx+si],al 00007C6F 0000 add [bx+si],al 00007C71 0000 add [bx+si],al 00007C73 0000 add [bx+si],al 00007C75 0000 add [bx+si],al 00007C77 0000 add [bx+si],al 00007C79 0000 add [bx+si],al 00007C7B 0000 add [bx+si],al 00007C7D 0000 add [bx+si],al 00007C7F 0000 add [bx+si],al 00007C81 0000 add [bx+si],al 00007C83 0000 add [bx+si],al 00007C85 0000 add [bx+si],al 00007C87 0000 add [bx+si],al 00007C89 0000 add [bx+si],al 00007C8B 0000 add [bx+si],al 00007C8D 0000 add [bx+si],al 00007C8F 0000 add [bx+si],al 00007C91 0000 add [bx+si],al 00007C93 0000 add [bx+si],al 00007C95 0000 add [bx+si],al 00007C97 0000 add [bx+si],al 00007C99 0000 add [bx+si],al 00007C9B 0000 add [bx+si],al 00007C9D 0000 add [bx+si],al 00007C9F 0000 add [bx+si],al 00007CA1 0000 add [bx+si],al 00007CA3 0000 add [bx+si],al 00007CA5 0000 add [bx+si],al 00007CA7 0000 add [bx+si],al 00007CA9 0000 add [bx+si],al 00007CAB 0000 add [bx+si],al 00007CAD 0000 add [bx+si],al 00007CAF 0000 add [bx+si],al 00007CB1 0000 add [bx+si],al 00007CB3 0000 add [bx+si],al 00007CB5 0000 add [bx+si],al 00007CB7 0000 add [bx+si],al 00007CB9 0000 add [bx+si],al 00007CBB 0000 add [bx+si],al 00007CBD 0000 add [bx+si],al 00007CBF 0000 add [bx+si],al 00007CC1 0000 add [bx+si],al 00007CC3 0000 add [bx+si],al 00007CC5 0000 add [bx+si],al 00007CC7 0000 add [bx+si],al 00007CC9 0000 add [bx+si],al 00007CCB 0000 add [bx+si],al 00007CCD 0000 add [bx+si],al 00007CCF 0000 add [bx+si],al 00007CD1 0000 add [bx+si],al 00007CD3 0000 add [bx+si],al 00007CD5 0000 add [bx+si],al 00007CD7 0000 add [bx+si],al 00007CD9 0000 add [bx+si],al 00007CDB 0000 add [bx+si],al 00007CDD 0000 add [bx+si],al 00007CDF 0000 add [bx+si],al 00007CE1 0000 add [bx+si],al 00007CE3 0000 add [bx+si],al 00007CE5 0000 add [bx+si],al 00007CE7 0000 add [bx+si],al 00007CE9 0000 add [bx+si],al 00007CEB 0000 add [bx+si],al 00007CED 0000 add [bx+si],al 00007CEF 0000 add [bx+si],al 00007CF1 0000 add [bx+si],al 00007CF3 0000 add [bx+si],al 00007CF5 0000 add [bx+si],al 00007CF7 0000 add [bx+si],al 00007CF9 0000 add [bx+si],al 00007CFB 0000 add [bx+si],al 00007CFD 0000 add [bx+si],al 00007CFF 0000 add [bx+si],al 00007D01 0000 add [bx+si],al 00007D03 0000 add [bx+si],al 00007D05 0000 add [bx+si],al 00007D07 0000 add [bx+si],al 00007D09 0000 add [bx+si],al 00007D0B 0000 add [bx+si],al 00007D0D 0000 add [bx+si],al 00007D0F 0000 add [bx+si],al 00007D11 0000 add [bx+si],al 00007D13 0000 add [bx+si],al 00007D15 0000 add [bx+si],al 00007D17 0000 add [bx+si],al 00007D19 0000 add [bx+si],al 00007D1B 0000 add [bx+si],al 00007D1D 0000 add [bx+si],al 00007D1F 0000 add [bx+si],al 00007D21 0000 add [bx+si],al 00007D23 0000 add [bx+si],al 00007D25 0000 add [bx+si],al 00007D27 0000 add [bx+si],al 00007D29 0000 add [bx+si],al 00007D2B 0000 add [bx+si],al 00007D2D 0000 add [bx+si],al 00007D2F 0000 add [bx+si],al 00007D31 0000 add [bx+si],al 00007D33 0000 add [bx+si],al 00007D35 0000 add [bx+si],al 00007D37 0000 add [bx+si],al 00007D39 0000 add [bx+si],al 00007D3B 0000 add [bx+si],al 00007D3D 0000 add [bx+si],al 00007D3F 0000 add [bx+si],al 00007D41 0000 add [bx+si],al 00007D43 0000 add [bx+si],al 00007D45 0000 add [bx+si],al 00007D47 0000 add [bx+si],al 00007D49 0000 add [bx+si],al 00007D4B 0000 add [bx+si],al 00007D4D 0000 add [bx+si],al 00007D4F 0000 add [bx+si],al 00007D51 0000 add [bx+si],al 00007D53 0000 add [bx+si],al 00007D55 0000 add [bx+si],al 00007D57 0000 add [bx+si],al 00007D59 0000 add [bx+si],al 00007D5B 0000 add [bx+si],al 00007D5D 0000 add [bx+si],al 00007D5F 0000 add [bx+si],al 00007D61 0000 add [bx+si],al 00007D63 0000 add [bx+si],al 00007D65 0000 add [bx+si],al 00007D67 0000 add [bx+si],al 00007D69 0000 add [bx+si],al 00007D6B 0000 add [bx+si],al 00007D6D 0000 add [bx+si],al 00007D6F 0000 add [bx+si],al 00007D71 0000 add [bx+si],al 00007D73 0000 add [bx+si],al 00007D75 0000 add [bx+si],al 00007D77 0000 add [bx+si],al 00007D79 0000 add [bx+si],al 00007D7B 0000 add [bx+si],al 00007D7D 0000 add [bx+si],al 00007D7F 0000 add [bx+si],al 00007D81 0000 add [bx+si],al 00007D83 0000 add [bx+si],al 00007D85 0000 add [bx+si],al 00007D87 0000 add [bx+si],al 00007D89 0000 add [bx+si],al 00007D8B 0000 add [bx+si],al 00007D8D 0000 add [bx+si],al 00007D8F 0000 add [bx+si],al 00007D91 0000 add [bx+si],al 00007D93 0000 add [bx+si],al 00007D95 0000 add [bx+si],al 00007D97 0000 add [bx+si],al 00007D99 0000 add [bx+si],al 00007D9B 0000 add [bx+si],al 00007D9D 0000 add [bx+si],al 00007D9F 0000 add [bx+si],al 00007DA1 0000 add [bx+si],al 00007DA3 0000 add [bx+si],al 00007DA5 0000 add [bx+si],al 00007DA7 0000 add [bx+si],al 00007DA9 0000 add [bx+si],al 00007DAB 0000 add [bx+si],al 00007DAD 0000 add [bx+si],al 00007DAF 0000 add [bx+si],al 00007DB1 0000 add [bx+si],al 00007DB3 0000 add [bx+si],al 00007DB5 0000 add [bx+si],al 00007DB7 0000 add [bx+si],al 00007DB9 0000 add [bx+si],al 00007DBB 0000 add [bx+si],al 00007DBD 0000 add [bx+si],al 00007DBF 0000 add [bx+si],al 00007DC1 0000 add [bx+si],al 00007DC3 0000 add [bx+si],al 00007DC5 0000 add [bx+si],al 00007DC7 0000 add [bx+si],al 00007DC9 0000 add [bx+si],al 00007DCB 0000 add [bx+si],al 00007DCD 0000 add [bx+si],al 00007DCF 0000 add [bx+si],al 00007DD1 0000 add [bx+si],al 00007DD3 0000 add [bx+si],al 00007DD5 0000 add [bx+si],al 00007DD7 0000 add [bx+si],al 00007DD9 0000 add [bx+si],al 00007DDB 0000 add [bx+si],al 00007DDD 0000 add [bx+si],al 00007DDF 0000 add [bx+si],al 00007DE1 0000 add [bx+si],al 00007DE3 0000 add [bx+si],al 00007DE5 0000 add [bx+si],al 00007DE7 0000 add [bx+si],al 00007DE9 0000 add [bx+si],al 00007DEB 0000 add [bx+si],al 00007DED 0000 add [bx+si],al 00007DEF 0000 add [bx+si],al 00007DF1 0000 add [bx+si],al 00007DF3 0000 add [bx+si],al 00007DF5 0000 add [bx+si],al 00007DF7 0000 add [bx+si],al 00007DF9 0000 add [bx+si],al 00007DFB 0000 add [bx+si],al //5. 00007DFD 字节单元放0x00 // 00007DFE 字节单元放0x55 // 00007DFF 字节单元放0xAA 00007DFD 0055AA add [di-0x56],dl
相关推荐
第1章 携黑客工具启程 2 1.1 调试器 2 1.2 反汇编器 6 1.3 反编译器 8 1.4 十六进制编辑器 10 1.5 解包器(Unpacker) 12 1.6 转储器 13 1.7 资源编辑器 14 1.8 窥测器(Spy) 14 1.9 监视器(Monitor) 15...
`NDISASM.EXE`是反汇编器,可以将机器码转换回汇编语言,这对于调试和理解已编译的代码非常有用。 最后,`BOOT.FLP`是一个软盘映像文件,通常用于模拟器或者实际的软盘设备,包含了引导加载程序。在模拟环境中,你...
通过对世界计算机编程大赛第一名作品“debug64k”的深入分析,我们不仅了解了机器码与汇编语言之间的联系,还学习了如何通过具体的实例来理解和运用这些知识。掌握汇编语言及其与机器码的转换对于深入计算机体系结构...
汇编工具通常包括汇编器、链接器和反汇编器等,它们帮助我们将用汇编语言编写的源代码转换为可执行文件。在这个压缩包中,我们可能会找到如NASM(Netwide Assembler)这样的汇编器,它是一款广泛使用的开源汇编工具...
- **反汇编器与模拟器**: 使用如NASM、MASM或调试器如OllyDbg等工具进行汇编代码的编译、链接和调试。 - **性能优化**: 学习如何通过调整指令顺序、减少内存访问和有效利用寄存器来提升程序运行效率。 5. **实验...
在IT领域,汇编语言是一种低级编程语言,它与计算机硬件紧密相关,允许程序员直接控制计算机的硬件资源。...了解并熟练掌握这些步骤是深入学习汇编语言的第一步,也是成为一名优秀系统级开发者的基础。
比如gas(GNU Assembler)和binutils中的objdump,可以用来反汇编已编译的代码,查看机器码,并进行性能分析。此外,优化汇编器选项(如-O2或-O3)可以帮助减少代码大小和提高执行效率。 7. IDEs和文本编辑器: ...
《ArtOfDisassembly》是一本深入探讨反汇编技术的专业书籍,它由Zero、CuTedEvil和Crick等人共同编著完成。这本书不仅适用于对逆向工程感兴趣的读者,同时也是黑客技术和网络安全领域的重要参考资料之一。本书通过...
6. **反汇编器**:对于二进制文件,RadASM2042还包含了反汇编功能,可以将机器码转换为汇编代码,便于分析和理解已存在的程序。 7. **插件支持**:为了扩展其功能,RadASM2042支持插件开发。用户或第三方开发者可以...
它的特性包括源代码编辑器、反汇编器、调试器以及项目管理工具。Radasm界面友好,支持语法高亮和自动完成,使得编写汇编代码更为高效。 ### 空程序模型结构 在Radasm中,一个空程序模型通常包含以下几个部分: 1....
| `disassemble` | 反汇编指定内存区域,默认反汇编当前函数 | #### 使用GDB进行调试 - **设置断点**:可以通过`break main`命令在`main`函数入口处设置断点。 - **查看代码**:使用`list`命令可以查看源代码,而`...