🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[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)