【asm基础】使用nasm进行汇编(基础)
说明
nasm与vs的masm存在差异,如nasm源程序可以只有指令,而不需要段分布,主函数等等。以下是一个例子:
mov eax, 0
inc eax
通过nasm编译:
编译完成后生成一个test.bin:
打开这个test.bin就可以看到指令的机器码:
对应源代码在VS中的反汇编:
多了个66,什么意思?
修改nasm编译源程序:
得到的机器码编程:
还是有问题,不同的机器码,怎么在同一个X86CPU里面运行?
(2016.08.21更新)
66是Intel汇编中的Instruction Prefixes,即指令前缀。有好几种指令前缀类型,66属于Oprand-size override prefix。
Intel对于同一指令下可操作不同的操作数的情况,没有特意使用不同的机器码,而是通过前缀来区分。这就能解释上面nasm中两条mov指令的区别。
不过VS和nasm在同样的32位操作数下有不同的结果还是没能解释。
(2017.01.02更新)
这边使用的编译主机是64位的,在上述的代码中没有指定默认的系统,所以它使用的是64位的编译,因此为了得到与VS反汇编一致的结果,需要设置编译时的系统位数:
bits 32
mov eax, 0
inc eax
这样编译得到的结果如下:
以上的test.bin理论上CPU可以直接执行,但是在windows系统下是不识别的,为了解决这个问题,可以使用虚拟机,将bin文件直接放到虚拟机结束后跳转到的位置(0x7c00,实际上是硬盘第一个扇区被加载的位置),这样bin文件就可以直接执行。所以要做的就是将虚拟机使用的第一个扇区修改为我们需要的bin,就可以执行这个代码了。
下面是Helloworld的nasm源程序代码:
mov ax, 0xb800 ;表示的是显存起始位置(后面还会提到)
mov ds, ax
mov byte [0x00], 'H' ;打印 Hello World!
mov byte [0x01],0x07
mov byte [0x02], 'e'
mov byte [0x01],0x07
mov byte [0x04], 'l'
mov byte [0x01],0x07
mov byte [0x06], 'l'
mov byte [0x01],0x07
mov byte [0x08], 'o'
mov byte [0x01],0x07
mov byte [0x0C], 'w'
mov byte [0x01],0x07
mov byte [0x0E], 'o'
mov byte [0x01],0x07
mov byte [0x10], 'r'
mov byte [0x01],0x07
mov byte [0x12], 'l'
mov byte [0x01],0x07
mov byte [0x14], 'd'
mov byte [0x01],0x07
mov byte [0x16], '!'
mov byte [0x01],0x07
jmp $ ;让 CPU 挂这里
times 393 db 0
db 0x55, 0xaa ;虚拟机需要检测 MBR 标记
编译后获得二进制,将二进制写入虚拟机使用的硬盘中,具体见图:
PS:使用虚拟机运行二进制的例子来自《x86汇编语言 : 从实模式到保护模式》。
【asm基础】使用nasm进行汇编(基础)相关推荐
- 【二进制基础篇-1】汇编基础
掌握汇编语言的目的是能够深入理解计算机系统的底层原理,在提高程序设计能力的同时也为二进制安全打下坚实的基础. 目录 1.CPU指令集 1.1 CPU的作用 1.2 CPU指令集 2.数据表示 2.1 ...
- 【asm基础】nasm使用简介
nasm编译 编译命令如下: nasm −f <format> <filename> [−o <output>] 参数介绍: -f:用来指定编译出来的.o文件的格式 ...
- 【转贴】GCC内联汇编基础
原文作者 Sandeep.S 英文原文 [https://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html] 本文将介绍GCC编译环境下 ...
- SDCC 的 MCS-51 汇编基础概念和传参方式
寄存器 Register 寄存器用于数据的临时存储, 其数据可以表示为 用于处理的数据字节 指向数据的地址 寄存器的结构 8051的寄存器几乎都是8位寄存器, 因为8位MCU处理的主要是8位数据, 如 ...
- oracle备份磁盘头,oracle asm 磁盘头数据以及备份与恢复基础篇(2)
oracle asm 磁盘头数据以及备份与恢复基础篇(二) 今天是2014-03-11,对于Oracle asm的元数据分为固定源数据和逻辑源数据,固定源数据一般占用磁盘的前两个au,其中内容包括di ...
- crash工具解析_crash工具和x86-64汇编基础
在前面的文章中,已经出现了作为Linux重要调试手段之一的crash工具的身影.在后续的文章里,我们还会继续用到它.因此在这里,准备对Linux中的crash工具的原理和使用方法,做一个相对全面的介绍 ...
- 反汇编---汇编基础学习
一.一些简单的说明 本文描述的是x86汇编,采用ATT汇编代码格式,讨论的是一个运行Linux的x86系统.使用gcc编译器,gdb调试器,objdump等相关工具观察反汇编代码. 关于寻址模式.堆栈 ...
- 《庖丁解牛Linux内核》笔记之:汇编基础
<庖丁解牛Linux内核>笔记之:汇编基础 参考视频 下面的说法都来自x86CPU寄存器. 值的不同表示方法 %eax 类似这种就是直接操作该寄存器,效果类似于C语言中的指针:*和& ...
- 【8086汇编基础】05--常用函数库文件--emu8086.inc
8086汇编语言初学者教程(第5部分) 常用函数库 - emu8086.inc 通过引用一些常用函数,可以使你编程更加方便.在你的程序中使用其他文件中的函数的方法是INCLUDE后面接上你要引用的文件 ...
- 汇编基础(加速入门)
汇编基础 语言 人与人沟通的媒介 什么是机器语言? 0与1 最早的程序员,穿孔卡带 运算->加减乘除 这些复杂的机器语言,如何简化? 助记符!! 汇编语言!! 加 IMC <-编译器-&g ...
最新文章
- fail-fast和fail-safe的介绍和区别
- WIN7 X64 Setup Oracle Developer Suite 10g
- 计算机软件著作权特征,计算机软件著作权的法律特征是什么
- C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区...
- Hibernate中Cascade和Inverse
- java编写设置按钮随机背景色_java – 如何设置自定义按钮状态背景颜色?
- GBDT 算法:原理篇
- HBase 1.3(NOSQL) 发布,性能大幅提升
- 非合作博弈篇——非合作博弈论问题的表示(strategic form)
- Windows11快捷键大全 win11常用快捷键介绍
- 液压系统管路流速推荐表_液压系统中油管尺寸的选择
- RS-485串口通讯测试及四路集线器功能探究
- 云流化如何实现多人线上协作的?
- 离职结婚面试买房蚂蚁上市—过山车般魔幻的2020
- PMP——第3章 项目经理的角色
- 用Python画小猪佩奇
- 生产计划管理软件功能是什么?对生产管理有何好处?
- Codeforces Round #548 C. Edgy Trees
- 联想st510开卡软件_无力吐槽的一单联想ST510固态硬盘数据恢复
- 浙大数据结构习题2.6递归求简单交错幂级数和