说明

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】汇编基础

    掌握汇编语言的目的是能够深入理解计算机系统的底层原理,在提高程序设计能力的同时也为二进制安全打下坚实的基础. 目录 1.CPU指令集 1.1 CPU的作用 1.2 CPU指令集 2.数据表示 2.1 ...

  2. 【asm基础】nasm使用简介

    nasm编译 编译命令如下: nasm −f <format> <filename> [−o <output>] 参数介绍: -f:用来指定编译出来的.o文件的格式 ...

  3. 【转贴】GCC内联汇编基础

    原文作者 Sandeep.S 英文原文 [https://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html] 本文将介绍GCC编译环境下 ...

  4. SDCC 的 MCS-51 汇编基础概念和传参方式

    寄存器 Register 寄存器用于数据的临时存储, 其数据可以表示为 用于处理的数据字节 指向数据的地址 寄存器的结构 8051的寄存器几乎都是8位寄存器, 因为8位MCU处理的主要是8位数据, 如 ...

  5. oracle备份磁盘头,oracle asm 磁盘头数据以及备份与恢复基础篇(2)

    oracle asm 磁盘头数据以及备份与恢复基础篇(二) 今天是2014-03-11,对于Oracle asm的元数据分为固定源数据和逻辑源数据,固定源数据一般占用磁盘的前两个au,其中内容包括di ...

  6. crash工具解析_crash工具和x86-64汇编基础

    在前面的文章中,已经出现了作为Linux重要调试手段之一的crash工具的身影.在后续的文章里,我们还会继续用到它.因此在这里,准备对Linux中的crash工具的原理和使用方法,做一个相对全面的介绍 ...

  7. 反汇编---汇编基础学习

    一.一些简单的说明 本文描述的是x86汇编,采用ATT汇编代码格式,讨论的是一个运行Linux的x86系统.使用gcc编译器,gdb调试器,objdump等相关工具观察反汇编代码. 关于寻址模式.堆栈 ...

  8. 《庖丁解牛Linux内核》笔记之:汇编基础

    <庖丁解牛Linux内核>笔记之:汇编基础 参考视频 下面的说法都来自x86CPU寄存器. 值的不同表示方法 %eax 类似这种就是直接操作该寄存器,效果类似于C语言中的指针:*和& ...

  9. 【8086汇编基础】05--常用函数库文件--emu8086.inc

    8086汇编语言初学者教程(第5部分) 常用函数库 - emu8086.inc 通过引用一些常用函数,可以使你编程更加方便.在你的程序中使用其他文件中的函数的方法是INCLUDE后面接上你要引用的文件 ...

  10. 汇编基础(加速入门)

    汇编基础 语言 人与人沟通的媒介 什么是机器语言? 0与1 最早的程序员,穿孔卡带 运算->加减乘除 这些复杂的机器语言,如何简化? 助记符!! 汇编语言!! 加 IMC <-编译器-&g ...

最新文章

  1. fail-fast和fail-safe的介绍和区别
  2. WIN7 X64 Setup Oracle Developer Suite 10g
  3. 计算机软件著作权特征,计算机软件著作权的法律特征是什么
  4. C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区...
  5. Hibernate中Cascade和Inverse
  6. java编写设置按钮随机背景色_java – 如何设置自定义按钮状态背景颜色?
  7. GBDT 算法:原理篇
  8. HBase 1.3(NOSQL) 发布,性能大幅提升
  9. 非合作博弈篇——非合作博弈论问题的表示(strategic form)
  10. Windows11快捷键大全 win11常用快捷键介绍
  11. 液压系统管路流速推荐表_液压系统中油管尺寸的选择
  12. RS-485串口通讯测试及四路集线器功能探究
  13. 云流化如何实现多人线上协作的?
  14. 离职结婚面试买房蚂蚁上市—过山车般魔幻的2020
  15. PMP——第3章 项目经理的角色
  16. 用Python画小猪佩奇
  17. 生产计划管理软件功能是什么?对生产管理有何好处?
  18. Codeforces Round #548 C. Edgy Trees
  19. 联想st510开卡软件_无力吐槽的一单联想ST510固态硬盘数据恢复
  20. 浙大数据结构习题2.6递归求简单交错幂级数和

热门文章

  1. 乐视复牌在即,重重的一刀终将砍下
  2. IP precedence和DSCP代码对照表
  3. 使用YOLOV5进行手势识别(详细教程)
  4. “网络威慑力”是个危险的游戏
  5. Squish console 窗口调试
  6. conda channel的镜像设置(设置可用清华源)
  7. php实现股票日线数据转换为周线月线,一文搞懂 月线、周线 交易技巧!(图解)...
  8. Photoscan 照片对齐后生成DEM的选项不能选
  9. newcoder错题集
  10. psping|端口连通性测试工具