Open CelestialCosmic opened 2 years ago
记录汇编学习所迈出的第一步
在两个学期的反复横跳(其实什么都没做)后,我终于选择了我要走的方向:re
archwiki 上给出了四种汇编器: binutils, fasm, nasm, yasm,我选择了 nasm
sudo pacman -S nasm
还是用万能的 vscode ,不过需要先行调试一下
首先找一段 helloworld (代码来源)
helloworld.asm
global _start section .text _start: mov rax,1 mov rdi,1 mov rsi,message mov rdx,13 syscall mov rax,60 xor rdi,rdi syscall section .data message: db "Hello,world",10
然后在终端中按着指引输出文件
nasm -f elf64 helloworld.asm && ld helloworld.o ./a.out
输出结果
Hello,world
现在我们清楚了操作流程:nasm 将 hello.asm转化为hello.o,然后与 gcc 联合汇编输出 a.out,我们之后需要的只是a.out
hello.asm
hello.o
a.out
launch.json
{ "request": "launch", "name": "assemble(elf64)", "type": "cppdbg", "program": "${workspaceFolder}/a.out", "cwd": "${workspaceFolder}", "preLaunchTask": "nasm" }
tasks.json
{ "label": "ld", "command":"ld", "args": ["-f","elf64","${file}", "&","ld","${fileDirname}/${fileBasenameNoExtension}.o", "-o","${workspaceFolder}/a.out"] },
写指令很快,碰钉子也很快......
prelaunch 没问题,但是输出文件后并不会输出字符串。检查了一下输出,似乎是因为工作文件夹不同的问题。
修改后然后连 nasm 都不输出了
fatal: more than one input file specified: &
但至少 launch.json 成功了
在现有的基础上重新开始调试
起初怀疑是 "&&" 的问题,改成了"&",虽然手动输出依旧正常,但是没能解决问题。
于是我将指令拆开了
nasm -f elf64 /home/celestial/Code/assemble/helloworld.asm ld /home/celestial/Code/assemble/helloworld.o -o /home/celestial/Code/a.out ./a.out
没有问题
这时我想起了tasks有一个属性叫做 dependsOn
tasks 一般只可执行一行内容,但是 dependsOn 是一个数组,可以支持多行指令的预处理
一番操作之后,问题解决,除了总会弹一个小报错
&"warning: GDB: Failed to set controlling terminal: Operation not permitted\n"
{ "label": "nasm", "command":"nasm", "args": ["-f","elf64","${file}"] }, { "label": "ld", "command":"ld", "args": ["${fileDirname}/${fileBasenameNoExtension}.o","-o","${workspaceFolder}/a.out"], "dependsOn":["nasm"] }
{ "request": "launch", "name": "assemble(elf64)", "type": "cppdbg", "program": "${workspaceFolder}/a.out", "cwd": "${workspaceFolder}", "preLaunchTask": "ld" }
汇编语言「Linux/x86-64」・第一步 vscode 预处理语法
记录汇编学习所迈出的第一步
起源
在两个学期的反复横跳(其实什么都没做)后,我终于选择了我要走的方向:re
选择汇编器
archwiki 上给出了四种汇编器: binutils, fasm, nasm, yasm,我选择了 nasm
sudo pacman -S nasm
测试指令
还是用万能的 vscode ,不过需要先行调试一下
首先找一段 helloworld (代码来源)
helloworld.asm
然后在终端中按着指引输出文件
输出结果
现在我们清楚了操作流程:nasm 将
hello.asm
转化为hello.o
,然后与 gcc 联合汇编输出a.out
,我们之后需要的只是a.out
配置 vscode
launch.json
tasks.json
写指令很快,碰钉子也很快......
prelaunch 没问题,但是输出文件后并不会输出字符串。检查了一下输出,似乎是因为工作文件夹不同的问题。
修改后然后连 nasm 都不输出了
但至少
launch.json
成功了在现有的基础上重新开始调试
第二次调试
起初怀疑是 "&&" 的问题,改成了"&",虽然手动输出依旧正常,但是没能解决问题。
于是我将指令拆开了
没有问题
这时我想起了tasks有一个属性叫做 dependsOn
tasks 一般只可执行一行内容,但是 dependsOn 是一个数组,可以支持多行指令的预处理
一番操作之后,问题解决,除了总会弹一个小报错
第二次配置 vscode
tasks.json
launch.json
参考依据