MASM
MASM是Microsoft Macro Assembler 的缩写,是微软公司为x86 微处理器家族开发的汇编开发环境,拥有可视化的开发界面,使开发人员不必再使用DOS环境进行汇编的开发,编译速度快,支持80x86汇编以及Win32Asm,是Windows下开发汇编的利器。它与windows平台的磨合程度非常好,但是在其他平台上就有所限制,使用MASM的开发人员必须在windows下进行开发。[1]
它支持的宏很灵巧,既广泛又多样性,结构化程序的惯用语法,包含高级架构式的循环、程序调用,以及轮替 (alternation)(因此,MASM 算是高级汇编器的一个范本)。
在这些新版Visual C++的 bin 目录中,皆有 ml.exe。Visual C++ .NET 2005的相同目录,还有一个 ml64.exe,它可以汇编x64的代码。相关的说明,都包含在这些新版Visual C++的说明文件里。
软件竞争
在 1990 年代初期,不管如何,有一些可供选择的汇编器,像是Borland TASM、共享版的A86,以及(在 90 年代末期)NASM,都开始取得 MASM 的一些市场份量。但是在 1990 年代终,有两种因素,使得 MASM 保住大部分的市场份量 [3] :
一是,微软停止把 MASM 作为商业产品一样的出售,并开始当成免费散布的DDK(驱动器发展包)之一部分;其次,MASM32 开发包、Iczelion's Win32 教材的出现,让视窗应用程序的设计,更方便使用 MASM.
后来在 2000 年,MASM 6.15的发布,一样是Visual C++ Processor Pack的一部份,费用全免。结果,在Visual C++ 6.0后来的所有版本,所包含的 MASM 之版本,都相等该[Visual C++](https://baike.baidu.com/item/Visual C%2B%2B)的版本。后来在Visual C++ 2005,64 比特版的 MASM 出现了(文件名为ml64.exe)。加上有庞大数量已安装 MASM 的用户群基础,这些因素,使得MASM仍能继续生存而不被淘汰。
- 在vs2017中编写汇编 - look_up_man的博客 - CSDN博客
https://blog.csdn.net/look_up_man/article/details/76161598 - asm基础—— vs下使用汇编 - jiangwei0512的博客 - CSDN博客
https://blog.csdn.net/jiangwei0512/article/details/50856834/ - 8086汇编语言入门-HelloWorld - imypp - 博客园
https://www.cnblogs.com/imypp/p/7609185.html - MASM_百度百科
https://baike.baidu.com/item/MASM/9685385?fr=aladdin - Microsoft 宏汇编程序参考 | Microsoft Docs
https://docs.microsoft.com/zh-cn/cpp/assembler/masm/microsoft-macro-assembler-reference?view=vs-2019 - MASM 在 VS 中的使用
简介
MASM是Microsoft Macro Assembler 的缩写,是微软公司为x86 微处理器家族开发的汇编开发环境,拥有可视化的开发界面,使开发人员不必再使用DOS环境进行汇编的开发,编译速度快,支持80x86汇编以及Win32Asm,是Windows下开发汇编的利器。它与windows平台的磨合程度非常好,但是在其他平台上就有所限制,使用MASM的开发人员必须在windows下进行开发。[1]
它支持的宏很灵巧,既广泛又多样性,结构化程序的惯用语法,包含高级架构式的循环、程序调用,以及轮替 (alternation)(因此,MASM 算是高级汇编器的一个范本)。
常用命令
hello.asm
;80x86汇编语言<入门程序>
;YPP.20170928
;文件名Hello.asm
DSEG SEGMENT
MESS DB 'Hello,World!' ,0DH,0AH,24H
DSEG ENDS
SSEG SEGMENT PARA STACK
DW 256 DUP(?)
SSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
BEGIN: MOV AX,DSEG
MOV DS,AX
MOV DX,OFFSET MESS
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
CSEG ENDS
END BEGIN
在VS中配置MASM
视频教程:MASM 在 VS 中的使用
代码示例:https://pastebin.com/R4WJwfn0
无法运行请参考:https://stackoverflow.com/a/4549741/8489782
寄存器视图:调试->窗口->寄存器
code
1
global _start
section .data
hello : db `hello, world!\n`
section .text
_start:
mov rax, 1 ; system call number should be stored in rax
mov rdi, 1 ; argument #1 in rdi: where to write (descriptor)?
mov rsi, hello ; argument #2 in rsi: where does the string start?
mov rdx, 14 ; argument #3 in rdx: how many bytes to write?
syscall ; this instruction invokes a system call
mov rax, 60 ; 'exit' syscall number
xor rdi, rdi ;
syscall
2
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 标记
Nasm编译器及简单使用方法1 - 简书
https://www.jianshu.com/p/0b1d7d3e7f80
简介
Nasm编译器是一款x86、x86_64的汇编器,使用Intel汇编格式。模块化设计、可移植。
官网地址
安装
Ubuntu系统下可以使用apt show nasm
来查看nasm
的版本
root@000d3fada0b3:~/asm# apt show nasm
Package: nasm
Version: 2.13.02-0.1
Priority: optional
Section: universe/devel
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Anibal Monsalve Salazar <anibal@debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 2831 kB
Depends: dpkg (>= 1.15.4) | install-info, libc6 (>= 2.14)
Homepage: http://www.nasm.us/
Download-Size: 359 kB
APT-Sources: http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages
Description: General-purpose x86 assembler
可以使用sudo apt-get install nasm
来下载
输入nasm -v
查看是否安装成功。
使用方法
- -f 格式化-o 输出文件名
- -O : 编译器优化开关,-O0表示关闭。默认为开启
- -E : 预处理
- -g : 生成调试信息
- -F : 调试信息的格式
查看Nasm支持的格式
nasm -hf
可以查看到支持的格式
valid output formats for -f are (`*' denotes default):
* bin flat-form binary files (e.g. DOS .COM, .SYS)
ith Intel hex
srec Motorola S-records
aout Linux a.out object files
aoutb NetBSD/FreeBSD a.out object files
coff COFF (i386) object files (e.g. DJGPP for DOS)
elf32 ELF32 (i386) object files (e.g. Linux)
elf64 ELF64 (x86_64) object files (e.g. Linux)
elfx32 ELFX32 (x86_64) object files (e.g. Linux)
as86 Linux as86 (bin86 version 0.3) object files
obj MS-DOS 16-bit/32-bit OMF object files
win32 Microsoft Win32 (i386) object files
win64 Microsoft Win64 (x86-64) object files
rdf Relocatable Dynamic Object File Format v2.0
ieee IEEE-695 (LADsoft variant) object file format
macho32 NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (i386) object files
macho64 NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (x86_64) object files
dbg Trace of all info passed to output stage
elf ELF (short name for ELF32)
macho MACHO (short name for MACHO32)
win WIN (short name for WIN32)
实际操作
创建文件
我们创建一个hello.s
文件,将下面的汇编代码粘贴到文件内。
global _start
section .data
hello : db `hello, world!\n`
section .text
_start:
mov rax, 1 ; system call number should be stored in rax
mov rdi, 1 ; argument #1 in rdi: where to write (descriptor)?
mov rsi, hello ; argument #2 in rsi: where does the string start?
mov rdx, 14 ; argument #3 in rdx: how many bytes to write?
syscall ; this instruction invokes a system call
mov rax, 60 ; 'exit' syscall number
xor rdi, rdi ;
syscall
汇编命令
将汇编代码汇编成目标文件(使用.s文件 生成.o文件 )
nasm -g -f elf64 -o hello.o hello.s
-g 生成debuging信息
-f 指定输出格式
-o 输出文件的名字
链接命令
使用目标文件生成可执行文件
ld -o hello hello.o
执行
root@000d3fada0b3:~/asm# ./hello
hello, world!
总结
生成的hello.o为什么不能执行?
我们反汇编一下,看看程序的内容
root@000d3fada0b3:~/asm# objdump -d -M intel hello.o
hello.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <_start>:
0: b8 01 00 00 00 mov eax,0x1
5: bf 01 00 00 00 mov edi,0x1
a: 48 be 00 00 00 00 00 movabs rsi,0x0
11: 00 00 00
14: ba 0e 00 00 00 mov edx,0xe
19: 0f 05 syscall
1b: b8 3c 00 00 00 mov eax,0x3c
20: 48 31 ff xor rdi,rdi
23: 0f 05 syscall
我们可以观察到,没有给程序的入口分配地址。
我们再观察一下可执行文件hello
root@000d3fada0b3:~/asm# objdump -d -M intel hello
hello: file format elf64-x86-64
Disassembly of section .text:
00000000004000b0 <_start>:
4000b0: b8 01 00 00 00 mov eax,0x1
4000b5: bf 01 00 00 00 mov edi,0x1
4000ba: 48 be d8 00 60 00 00 movabs rsi,0x6000d8
4000c1: 00 00 00
4000c4: ba 0e 00 00 00 mov edx,0xe
4000c9: 0f 05 syscall
4000cb: b8 3c 00 00 00 mov eax,0x3c
4000d0: 48 31 ff xor rdi,rdi
4000d3: 0f 05 syscall
在这里可以看到程序的入口时分配了地址的。
NASM(The Netwide Assembler)
Nasm编译器是一款x86、x86_64的汇编器,使用Intel汇编格式。模块化设计、可移植
- NASM 官网
https://www.nasm.us/ - 官方下载地址: https://www.nasm.us/pub/nasm/snapshots/
- Nasm编译器及简单使用方法1 - 简书
- https://www.jianshu.com/p/0b1d7d3e7f80
- nasm_百度百科
https://baike.baidu.com/item/nasm/10798233?fr=aladdin - Hex to ascii - comp.lang.asm.x86
http://compgroups.net/comp.lang.asm.x86/hex-to-ascii/449266 - GitHub - letolabs/nasm: Mirror of main nasm git repo at http://repo.or.cz/w/nasm.git
https://github.com/letolabs/nasm - Public Git Hosting - nasm.git/summary
https://repo.or.cz/w/nasm.git - asm基础——使用nasm进行汇编(基础) - jiangwei0512的博客 - CSDN博客
https://blog.csdn.net/jiangwei0512/article/details/50859744
百科摘要
NASM全称The Netwide Assembler,是一款基于80x86和x86-64平台的汇编语言编译程序,其设计初衷是为了实现编译器程序跨平台和模块化的特性。NASM支持大量的文件格式,包括Linux,*BSD,a.out,ELF,COFF,Mach−O,Microsoft 16−bit OBJ,Win32以及Win64,同时也支持简单的二进制文件生成。它的语法被设计的简单易懂,相较Intel的语法更为简单,支持目前已知的所有x86架构之上的扩展语法,同时也拥有对宏命令的良好支持。
NASM当初被设计出来的想法是因为没有一个好的免费的x86系例的汇编器可以使用,所以,必须有人来写一个。
常用命令
hello.s
global _start
section .data
hello : db `hello, world!\n`
section .text
_start:
mov rax, 1 ; system call number should be stored in rax
mov rdi, 1 ; argument #1 in rdi: where to write (descriptor)?
mov rsi, hello ; argument #2 in rsi: where does the string start?
mov rdx, 14 ; argument #3 in rdx: how many bytes to write?
syscall ; this instruction invokes a system call
mov rax, 60 ; 'exit' syscall number
xor rdi, rdi ;
syscall
编译
nasm -g -f elf64 -o hello.o hello.s
-g generate debug information in selected format
-f format select an output format
链接
如果没有 ld
命令,Ubuntu 会提示你使用命令 sudo apt install binutils
进行安装
ld -o hello hello.o
-o
执行
./hello
查看nasm支持的格式
nasm -hf
For a list of valid output formats, use -hf.
asm
-
【图片】【转】asm初级教程【口袋改版资源吧】_百度贴吧
https://tieba.baidu.com/p/5561048685?red_tag=0387199671&traceid= -
汇编语言入门教程 - 阮一峰的网络日志
http://www.ruanyifeng.com/blog/2018/01/assembly-language-primer.html -
菜鸟也疯狂系列汇编视频教程(80集全)
http://c.biancheng.net/view/1659.html -
GitHub - Schweigi/assembler-simulator: Simple 8-bit Assembler Simulator with Angular.js
https://github.com/Schweigi/assembler-simulator -
8086汇编模拟工具(Emu8086)下载v3.08 绿色汉化版-学习汇编语言的理想工具西西软件下载
https://www.cr173.com/soft/38250.html
编译器
常见的编译器有masm、nasm
简单汇编模拟器
GitHub - Schweigi/assembler-simulator: Simple 8-bit Assembler Simulator with Angular.js
https://github.com/Schweigi/assembler-simulator
简单的汇编模拟器教程(JavaScript)部分2[译] - hjjscofield的专栏 - CSDN博客
https://blog.csdn.net/hjjscofield/article/details/55047329
简单汇编模拟器的语法 - hjjscofield的专栏 - CSDN博客
https://blog.csdn.net/hjjscofield/article/details/54960754
常见寄存器
寄存器 | 16位 | 32位 | 64位 |
---|---|---|---|
累加寄存器 | AX | EAX | RAX |
基址寄存器 | BX | EBX | RBX |
计数寄存器 | CX | ECX | RCX |
数据寄存器 | DX | EDX | RDX |
堆栈基指针 | BP | EBP | RBP |
变址寄存器 | SI | ESI | RSI |
堆栈顶指针 | SP | ESP | RSP |
指令寄存器 | IP | EIP | RIP |
指令
mov
movb(8位)、movw(16位)、movl(32位)、movq(64位)
寄存器寻址
movl %eax, %edx
eax -> edx
立即数寻址:
movl $0x123, %edx
# 数字->寄存器
直接寻址:
movl 0x123, %edx
直接访问内存地址数据,edx = (int32_t )0x123;
间接寻址:
movl (%ebx), %edx
%ebx 是个内存地址,(%ebx)指的是该地址中的数据,edx = (int32_t)ebx;
变址寻址:
movl 4(%ebx), %edx
edx = (int32_t)(ebx+4);
几种基本汇编指令详解 - 远航 | FIBOS.io - CSDN博客
https://blog.csdn.net/luoyhang003/article/details/46786591
常用的汇编指令 - Quincy.Coder的博客 - CSDN博客
https://blog.csdn.net/qq_33733970/article/details/78572733
发表评论