编译器采用nasm,语法为intel;连接器为gcc的ld,调试器为gdb(暂时有点小问题,但不影响运行),IDE为VS Code。
编译器
编译器的不同,会导致采用的汇编语言风格有差异。一般在windows使用MASM(INTEL风格)汇编器,linux和mac上可以使用GCC-AS(GCC,AT&T风格),另外三个系统也可以使用跨平台汇编编译器NASM(INTEL风格)。安装方式如下:
NASM
sudo apt install nasm
GCC-AS
as这款软件在binutils内含,binutils属于操作系统预装软件。
链接器
LD
ld属于gcc附带软件,安装gcc即可:
sudo apt install build-essential
调试器
gdb
sudo apt install gdb
VS Code配置
一共两个文件,一个工程目录下的.vscode/tasks.json
{"version": "2.0.0","tasks":[{"label": "nasm","type": "shell","command": "nasm","args": ["-felf64", //32位可填-felf32"-o","${fileDirname}/${fileBasenameNoExtension}.o","${file}"]},{"label": "ld","type": "shell","command": "ld","args": ["${fileDirname}/${fileBasenameNoExtension}.o","-o","${fileDirname}/${fileBasenameNoExtension}"],"dependsOn":["nasm"]}]}
另一个是工程目录下的.vscode/launch.json
{"version": "0.2.0","configurations": [{"name":"(gdb)launch","type": "cppdbg","request": "launch","program": "${fileDirname}/${fileBasenameNoExtension}","stopAtEntry": false, //选为true则会在打开控制台后停滞,暂时不执行程序"preLaunchTask": "ld", //前置task的名字"cwd": "${workspaceFolder}","environment": [],"MIMode": "gdb","setupCommands": [{"description": "Enable pretty-printing for gdb","text": "-enable-pretty-printing","ignoreFailures": true}],"linux": {"miDebuggerPath": "/usr/bin/gdb",},"windows": {"miDebuggerPath": "C:\\ProgramData\\chocolatey\\bin\\gdb.exe",//"externalConsole": false},"externalConsole": false}]}
使用简介
vs code打开示例代码:
; ---------------------------------------------------------------------------------; intel风格; 仅使用syscall将"Hello,World"写入控制台。仅在64位Linux上运行。; 使用 Linux 下的 1 号系统调用来输出一条信息和 60 号系统调用来退出程序。; 编译汇编代码并运行:;; nasm -felf64 hello.asm && ld hello.o && ./a.out; ---------------------------------------------------------------------------------global _startsection .text_start:; write(1, message, 13)mov rax, 1 ; 1 号系统调用是写操作mov rdi, 1 ; 1 号文件系统调用是标准输出stdoutmov rsi, message ; 输出字符串的地址mov rdx, 13 ; 字节数(输出字符串的长度)syscall ; 调用操作系统进行写入; exit(0)mov rax, 60 ; 60号系统调用是退出xor rdi, rdi ; 退出代码 0syscall ; 调用操作系统退出section .datamessage: db "Hello,World", 13, 10 ; 13是回车符,10是换行符,皆为ascii
按F5即可。
