[TOC]
![](https://img.kancloud.cn/f1/64/f164c5549933e76e6c4f3a479dacfbf7_1121x874.png)
![](https://img.kancloud.cn/4a/54/4a54267a87710d45028df1407b5222a0_230x472.png)![](https://img.kancloud.cn/3b/37/3b3766920f1e0d0a7f2197ae8082864c_538x313.png)
![](https://img.kancloud.cn/a8/39/a83937da5bf55ef66f0a5e205bc3b5e1_1849x991.png)
![](https://img.kancloud.cn/07/f7/07f7cef3c9f3a9105cfdb37d9d332e4a_820x442.png)
## **编写源程序**
### **新建test.asm文件,然后编写求2^3的代码**
这个可以用记事本、sublime([**NASM x86 Assembly**](https://blog.csdn.net/qq_35572368/article/details/104984317)插件可以高亮)、editPlus或者edit.exe
这里介绍edit.exe使用方法。打开dos
![](https://img.kancloud.cn/e1/63/e163b3e2d9b8e34ee1a6fcb7a35865ff_435x426.png)
看到dos的c盘已经映射到edit.exe所在的目录,dos中键入edit回车启动编辑器,然后编写汇编代码并保存为test.asm:
![](https://img.kancloud.cn/d8/0a/d80a75b7e949b19362ac0999bb356d55_654x433.png)
![](https://img.kancloud.cn/f6/f1/f6f12e74ef58cc2d93300a1675807827_244x231.png)
![](https://img.kancloud.cn/b3/af/b3af389f74508f61507d6887afef2622_1064x458.png)
```
assume cs:abc
abc segment
mov ax,2
add ax,ax
add ax,bx
mov ax,4c00H
int 21H
abc ends
end
```
步骤:![](https://img.kancloud.cn/f5/3a/f53a35d3e41a50e5f4c3b5203766ab0c_1078x782.png)
### **MASM.exe编译获得目标文件:xxx.obj**
![](https://img.kancloud.cn/2f/3c/2f3c10d64d37c25773ec43a90f154c14_626x376.png)
看到dos的c盘已经映射到MASM.exe所在的目录,dos中键入masm+回车启动微软的编译器MASM.exe
![](https://img.kancloud.cn/5d/e8/5de8d340af2325895fa1cebe13dc6cb2_896x265.png)
指定目录及文件名
![](https://img.kancloud.cn/35/d3/35d3e1d4e545425eab6bd92ebfb0c317_569x212.png)
![](https://img.kancloud.cn/53/39/5339c00efb9c8a356111a085a9eb1baf_640x215.png)
**简化方式编译:必须加分号**
```
masm test;
```
![](https://img.kancloud.cn/81/f7/81f7ca5de9046896612ab829be78c055_687x157.png)
### **LINK.exe连接目标文件xxx.obj以获取可执行文件xxx.exe**
![](https://img.kancloud.cn/16/c0/16c037d7f9c3fb0a1f03779510285fc5_641x207.png)
![](https://img.kancloud.cn/d3/c4/d3c40d5a63770a582e4bde4266aa4590_160x112.png)
![](https://img.kancloud.cn/34/70/34708ae3c1f8b33607219b49080eb203_946x528.png)
**简化方式连接:必须加分号**
```
link test;
```
![](https://img.kancloud.cn/4a/e8/4ae8950321470d3b0e1d5407ef44c488_622x125.png)
### **xxx.exe的执行**
看不到结果是应为没有想显示器输出结果
![](https://img.kancloud.cn/e6/ff/e6ffe7727581aef60f8a8a4601818aaf_642x54.png)
![](https://img.kancloud.cn/83/8b/838be550408767d091361da870a95cec_569x380.png)
我们在前面讲过,在DOS中,可执行文件中的程序P1若要运行,必须有一个正在运行的程序P2,将P1从可执行文件中加载入内存,将CPU的控制权交给它, P1才能得以运行;当P1运行完毕后,应该将CPU的控制权交还给使它得以运行的程序P2.
按照上面的原理,test.exe的执行过程(思考相关的问题)。
* (1)在提示符"c:masm"后面输入可执行文件的名字"test",按Enter键。这时,有一个正在运行的程序将test.exe中的程序加载入内存,这个正在运行的程序是什么?它将程序加载入内存后,如何使程序得以运行?
* >[info] (1)在DOS中直接执行test.exe时,是正在运行的command,将1.exe中的程序加载入内存
* (2) 1.exe中的程序运行。
* >[info] (2) command设置CPU的CS:IP指向程序的第一条指令(即程序的入口),从而使程序得以运行:
* (3)运行结束,返回,再次显示提示符"c:masm" 。程序运行结束后,返回到哪里?
* >[info] (3)程序运行结束后,返回到command中, CPU继续运行command.
## **debug跟踪程序执行**
编写汇编程序并编译连接为p1-1.exe
~~~
assume cs:codesg
codesg segment
mov ax,0123H
add bx,0456H
add ax,bx
add ax,ax
mov ax,4c00H
int 21H
codesg ends
end
~~~
执行`debug p1-1.exe`
r查看 ****数据段寄存器DS**为075A、(代码)段寄存器cs** 为076A
![](https://img.kancloud.cn/f9/77/f97788a6bd4dc7ac93bb94678a86d083_1833x1005.png)
![](https://img.kancloud.cn/50/33/50335db5035619403fb63482d1b5d68f_1826x988.png)
![](https://img.kancloud.cn/3c/6b/3c6bb5313a11935b5561ce65052fd91a_1866x1035.png)
![](https://img.kancloud.cn/e5/45/e545ca83abb0e4c74d993a14d27f3ebc_1836x1016.png)