Open CelestialCosmic opened 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执行
segment、ends 是一对,标记一段的开始与结束,其中存放汇编代码。
segment
ends
end 是程序结束的标志,与 ends 不同
end
assume用于指定段寄存器,可以将代码段与段寄存器联系起来。
assume
程序
程序就是段内的内容,它们会变成机器码。
标号
可以理解为函数名,写在segment、ends的前面,最后被处理为段的段地址
返回值
mov ax,4c00h 和 int 21H 两句就是返回值的代码。
mov ax,4c00h
int 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 间转换自如。
2021/12/27
上传的时候才发现我原来连二都没上传(捂脸)
完成一个程序
示例程序
程序的结构
伪指令、汇编指令
伪指令只作为标记,只有汇编指令才会被 cpu执行
segment
、ends
是一对,标记一段的开始与结束,其中存放汇编代码。end
是程序结束的标志,与ends
不同assume
用于指定段寄存器,可以将代码段与段寄存器联系起来。程序
程序就是段内的内容,它们会变成机器码。
标号
可以理解为函数名,写在
segment
、ends
的前面,最后被处理为段的段地址返回值
mov ax,4c00h
和int 21H
两句就是返回值的代码。程序输出
首先此处的语法为 masm 的语法,而之前 helloworld 使用的是 nasm 的语法,在linux 中如果需要兼容,我们需要使用 uasm 。
uasm 在 AUR 中,如果介意也可以安装 dosbox 开启虚拟机,在虚拟机中执行。
yay -s uasm
在原来的基础上,我改进了 vscode 的输出,具体代码如如下
task.json
launch.json
如此这般,通过两个调试选项,便可以在 nasm 和 masm 间转换自如。