编译器采用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 _start
section .text
_start:
; write(1, message, 13)
mov rax, 1 ; 1 号系统调用是写操作
mov rdi, 1 ; 1 号文件系统调用是标准输出stdout
mov rsi, message ; 输出字符串的地址
mov rdx, 13 ; 字节数(输出字符串的长度)
syscall ; 调用操作系统进行写入
; exit(0)
mov rax, 60 ; 60号系统调用是退出
xor rdi, rdi ; 退出代码 0
syscall ; 调用操作系统退出
section .data
message: db "Hello,World", 13, 10 ; 13是回车符,10是换行符,皆为ascii
按F5即可。