CelestialCosmic / themeblog

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

汇编笔记(二) #24

Open CelestialCosmic opened 2 years ago

CelestialCosmic commented 2 years ago

2021/12/27

上传的时候才发现我原来连二都没上传(捂脸)

完成一个程序

示例程序

assume cs:codesg

codesg segment

        mov ax,0123H
        mov bx,0456H
        add ax,bx
        add ax,ax

        mov ax,4c00H
        int 21H

codesg ends

end

程序的结构

伪指令、汇编指令

伪指令只作为标记,只有汇编指令才会被 cpu执行

segmentends 是一对,标记一段的开始与结束,其中存放汇编代码。

end 是程序结束的标志,ends 不同

assume用于指定段寄存器,可以将代码段与段寄存器联系起来。

程序

程序就是段内的内容,它们会变成机器码。

标号

可以理解为函数名,写在segmentends的前面,最后被处理为段的段地址

返回值

mov ax,4c00hint 21H 两句就是返回值的代码。

程序输出

首先此处的语法为 masm 的语法,而之前 helloworld 使用的是 nasm 的语法,在linux 中如果需要兼容,我们需要使用 uasm 。

uasm 在 AUR 中,如果介意也可以安装 dosbox 开启虚拟机,在虚拟机中执行。

yay -s uasm

在原来的基础上,我改进了 vscode 的输出,具体代码如如下

task.json

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

launch.json

        {
            "request": "launch",
            "name": "LinuxASM",
            "type": "cppdbg",
            "program": "${workspaceFolder}/a.out",
            "cwd": "${workspaceFolder}",
            "preLaunchTask": "ld.nasm"
        },
        {
            "request": "launch",
            "name": "WindowsASM",
            "type": "cppdbg",
            "program": "${workspaceFolder}/a.out",
            "cwd": "${workspaceFolder}",
            "preLaunchTask": "ld.uasm"
        },

如此这般,通过两个调试选项,便可以在 nasm 和 masm 间转换自如。