目录
- [1. 前置知识](#1. 前置知识)
-
- [1.1 环境配置及调试运行(以vscode为例)](#1.1 环境配置及调试运行(以vscode为例))
- [1.2 debug如何调试](#1.2 debug如何调试)
- [2. 源程序到可执行程序](#2. 源程序到可执行程序)
- [3. BX寄存器](#3. BX寄存器)
- [4. loop循环指令](#4. loop循环指令)
1. 前置知识
汇编语言的文件后缀名是.asm
1.1 环境配置及调试运行(以vscode为例)
- 下载vscode软件
- 下载插件
- 配置插件

下载好后,启用MASM/TASM扩展,点击它右下角的设置--->扩展设置--->选择MASM--->(DOS模拟器建议dosbox)


- 新建文件,后缀名为.asm,编写代码。
- 运行:右击鼠标,选择运行
- 调试:右击鼠标,选择"调试当前程序",会弹出一个黑框框,在里面调试即可

1.2 debug如何调试
命令:
p:程序正常结束
q:退出调试
exit:退出debug界面
2. 源程序到可执行程序
步骤:
(1)源程序编辑 文本编辑器 汇编语言源文件.asm文件
(2)源程序汇编 masm.exe或ml.exe 目标文件.obj文件
(3)目标文件链接 link.exe .exe
(4)可执行文件调试 debug.exe .exe
历程:

2.1 源程序
简单程序说明:
-
伪指令(格式)
xxx segment end
xxx ends
assume
-
指令 (代码段)
-
标号(可自定义)
codesg

伪指令



end

assume

标号

结束

2.2 编译链接图解

2.3 程序的基本框架
框架:各种段构成,存放数据、代码、栈空间等等
如:编程运算2^3
-
定义一个段,名称为abs
asmabc segment ;定义一个段,名称为abs ...... abc ends -
在这个段中写入汇编命令,来实现任务
asmabc segment mov ax, 2 ;写入汇编命令 add ax, ax add ax, ax mov ax, 4c00H int 21H abc ends -
指出程序在何处结束
asmabc segment mov ax, 2 add ax, ax add ax, ax mov ax, 4c00H int 21H abc ends end ;程序在此处结束 -
abc被当作代码段来用,所以应该和abc和cs联系起来
asmassume cs:abs ;abc和abc和cs联系起来 abc segment mov ax, 2 add ax, ax add ax, ax mov ax, 4c00H int 21H abc ends end
2.4 程序编译
-
若使用下载的masm软件,则cmd打开终端,进入masm目录下
- 输入:masm 要编译的asm文件路径,生成obj文件

- obj文件在masm的安装目录下生成

- 再输入:link obj文件名,可以生成对应的exe程序(64位电脑会不兼容,需要挂载到其他盘符上)解决masm在64位windows版本不兼容无法运行
- 输入:masm 要编译的asm文件路径,生成obj文件
-
用vscode插件,直接右键调试即可

t命令:每次执行一条汇编指令
当下一条指令为int 21H时,需要P命令表示程序结束。

3. BX寄存器
mov ax, [0]是将ds:0000处开始的内容送入ax。
[0]表示一个内存单元,0是偏移地址,段地址默认ds,而长度由具体指令中的其他操作对象如寄存器指定。
bx\]的默认段寄存器也是ds 如: mov ax, \[bx
mov al, [bx]
因为某些原因,我们使用"()"来表示一个寄存器或内存单元中的内容,如(ax)表示ax的内容,(20000H)表示内存。

4. loop循环指令
loop指令格式:loop 标号
CPU执行loop时,要进行两步操作:
- (cx)=(cx)-1
- 判断cx中的值,不为0则跳到标号处执行,为0则向下执行。
loop做循环指令,cx放循环次数。
asm
assume cs:code
code segment
mov ax, 2
mov cx, 11
s: add ax, ax
loop s
mov ax, 4c00h
int 21h
code ends
end


注意[0]和0在masm中的混淆:
在debug中,mov ax,[0]没有问题,但是在masm中会被当做mov ax,0处理。

解决:mov ax, [0]
- 将0先放入bx中,再mov ax, [bx]
- 写出默认寄存器:mov ax, ds:[0]