编译器采用nasm,语法为intel;连接器为gcc的ld,调试器为gdb(暂时有点小问题,但不影响运行),IDE为VS Code。

编译器

编译器的不同,会导致采用的汇编语言风格有差异。一般在windows使用MASM(INTEL风格)汇编器,linux和mac上可以使用GCC-AS(GCC,AT&T风格),另外三个系统也可以使用跨平台汇编编译器NASM(INTEL风格)。安装方式如下:

NASM

  1. sudo apt install nasm

GCC-AS

as这款软件在binutils内含,binutils属于操作系统预装软件。

链接器

LD

ld属于gcc附带软件,安装gcc即可:

  1. sudo apt install build-essential

调试器

gdb

  1. sudo apt install gdb

VS Code配置

一共两个文件,一个工程目录下的.vscode/tasks.json

  1. {
  2. "version": "2.0.0",
  3. "tasks":[
  4. {
  5. "label": "nasm",
  6. "type": "shell",
  7. "command": "nasm",
  8. "args": [
  9. "-felf64", //32位可填-felf32
  10. "-o",
  11. "${fileDirname}/${fileBasenameNoExtension}.o",
  12. "${file}"
  13. ]
  14. },
  15. {
  16. "label": "ld",
  17. "type": "shell",
  18. "command": "ld",
  19. "args": [
  20. "${fileDirname}/${fileBasenameNoExtension}.o",
  21. "-o",
  22. "${fileDirname}/${fileBasenameNoExtension}"
  23. ],
  24. "dependsOn":["nasm"]
  25. }
  26. ]
  27. }

另一个是工程目录下的.vscode/launch.json

  1. {
  2. "version": "0.2.0",
  3. "configurations": [
  4. {
  5. "name":"(gdb)launch",
  6. "type": "cppdbg",
  7. "request": "launch",
  8. "program": "${fileDirname}/${fileBasenameNoExtension}",
  9. "stopAtEntry": false, //选为true则会在打开控制台后停滞,暂时不执行程序
  10. "preLaunchTask": "ld", //前置task的名字
  11. "cwd": "${workspaceFolder}",
  12. "environment": [],
  13. "MIMode": "gdb",
  14. "setupCommands": [
  15. {
  16. "description": "Enable pretty-printing for gdb",
  17. "text": "-enable-pretty-printing",
  18. "ignoreFailures": true
  19. }
  20. ],
  21. "linux": {
  22. "miDebuggerPath": "/usr/bin/gdb",
  23. },
  24. "windows": {
  25. "miDebuggerPath": "C:\\ProgramData\\chocolatey\\bin\\gdb.exe",
  26. //"externalConsole": false
  27. },
  28. "externalConsole": false
  29. }
  30. ]
  31. }

使用简介

vs code打开示例代码:

  1. ; ---------------------------------------------------------------------------------
  2. ; intel风格
  3. ; 仅使用syscall"Hello,World"写入控制台。仅在64Linux上运行。
  4. ; 使用 Linux 下的 1 号系统调用来输出一条信息和 60 号系统调用来退出程序。
  5. ; 编译汇编代码并运行:
  6. ;
  7. ; nasm -felf64 hello.asm && ld hello.o && ./a.out
  8. ; ---------------------------------------------------------------------------------
  9. global _start
  10. section .text
  11. _start:
  12. ; write(1, message, 13)
  13. mov rax, 1 ; 1 号系统调用是写操作
  14. mov rdi, 1 ; 1 号文件系统调用是标准输出stdout
  15. mov rsi, message ; 输出字符串的地址
  16. mov rdx, 13 ; 字节数(输出字符串的长度)
  17. syscall ; 调用操作系统进行写入
  18. ; exit(0)
  19. mov rax, 60 ; 60号系统调用是退出
  20. xor rdi, rdi ; 退出代码 0
  21. syscall ; 调用操作系统退出
  22. section .data
  23. message: db "Hello,World", 13, 10 ; 13是回车符,10是换行符,皆为ascii

按F5即可。