CelestialCosmic / themeblog

blog articles by Celestial_Cosmic,source code by chanshiyucx
0 stars 0 forks source link

初识汇编 #20

Open CelestialCosmic opened 2 years ago

CelestialCosmic commented 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

配置 vscode

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"

第二次配置 vscode

tasks.json

        {
            "label": "nasm",
            "command":"nasm",
            "args": ["-f","elf64","${file}"]
        },
        {
            "label": "ld",
            "command":"ld",
            "args": ["${fileDirname}/${fileBasenameNoExtension}.o","-o","${workspaceFolder}/a.out"],
            "dependsOn":["nasm"]
        }

launch.json

        {
            "request": "launch",
            "name": "assemble(elf64)",
            "type": "cppdbg",
            "program": "${workspaceFolder}/a.out",
            "cwd": "${workspaceFolder}",
            "preLaunchTask": "ld"
        }

参考依据

汇编语言「Linux/x86-64」・第一步 vscode 预处理语法