用DosBox写第一个汇编Helloworld
迫于学业终究还是要学汇编,感觉用汇编写东西就没有用高级语言写东西写的爽快,太硬核了。不装dosbox就得装虚拟机用XP,还是装dosbox吧。
1 安装DosBox以及相关内容
到DosBox官网下个windows版本的,简单的安装,没啥可说的。
然后就是找个地方用来放我们的程序,我放到了D:\Documents\files\Dosapp
这里,然后需要准备几个应用程序也放到这里面方便我们使用。就是是debug.exe、masm.exe、link.exe,分别用来调试、汇编、连接。(把老师给我们发的文件放到了百度云,提取码:a8s7,其实上网搜也很容易找到)放进刚才用来放程序的路径中。
为了免去每次打开都需要用mount指令创建盘符,可以在配置文件中把mount指令添加到打开自动执行中。
配置文件在这个地方,
然后把这个加在最后就行了(k也可以换成其他,后面的路径就是我们之前创建的路径)。
mount k D:\Documents\files\Dosapp
k:
2 代码
在D:\Documents\files\Dosapp
内创建一个demo.asm文件,用vscode打开。然后找来了一段helloworld的程序。花了一些时间总算勉强弄明白了,都写在了注释里面。
发现有一点就是,一行的注释太长居然会汇编出错?
于是把; ‘ASSUME,段寻址伪指令’ 用来告诉汇编程序当前使用的各个段的段地址将要存放在哪个段寄存器中,但其实除了CS段寄存器之外,其他的段寄存器都赋不了值,需要待会重新给其他的段寄存器赋值
这个换成了两行,解决了问题。
; 数据段
DATA SEGMENT
MESS DB 'Hello,World!' ,0DH ,0AH ,24H ; DB 是定义字节类型变量,字符串存储必须用DB,不能用DW
; 0DH : 回车
; 0AH : 换行
; 24H : '$' ,即结束符号
DATA ENDS
; 数据段结束
; 堆栈段,不加这个会有警告,这个程序其实不需要用到堆栈
SSEG SEGMENT PARA STACK
DW 256 DUP(?)
SSEG ENDS
; 堆栈段结束
; 代码段
CODE SEGMENT
ASSUME CS:CODE, DS:DATA ; ‘ASSUME,段寻址伪指令’ 用来告诉汇编程序当前使用的各个段的段地址将要存放在哪个段寄存器中,
; 但其实除了CS段寄存器之外,其他的段寄存器都赋不了值,需要待会重新给其他的段寄存器赋值
BEGIN:
MOV AX,DATA ; 指定数据段, 但是段寄存器不能直接赋值,需要通过AX过渡一下
MOV DS,AX
MOV DX,OFFSET MESS ; 将MESS的首地址传给DX,OFFSET表示取首地址
MOV AH,9 ; 接下来要调用 ‘输出字符串’
; ‘输出字符串’ 的 入口参数为 DS:DX=串地址,字串结束为“$”符号
INT 21H ; 系统功能调用
MOV AH,4CH ; 接下来要调用 ‘返回DOS系统’
INT 21H ; 系统功能调用
CODE ENDS
; 数据段结束
END BEGIN
用vscode写代码,搜了一下关于asm的扩展插件不多。现在用的x86 and x86_64 Assembly,是我试了好几个代码高亮的插件之后比较符合我的感觉的。效果就像下图一样。
3 汇编运行
然后打开Dosbox,可以看到一打开就已经自动的执行了mount k D:\Documents\files\Dosapp
和k:
。
然后输入masm demo;
进行汇编,没有错后输入link demo;
进行连接。也没有错之后输入demo
就可以运行了。输入’;'让后面几个要输入的参数为默认,之前写的分号搞出乌龙了。
完成。