文章目录

前言

一、汇编程序的代码框架

二、使用masm生成exe文件

1.编译

2.连接

三、使用debug调试程序

四、debug命令小结

1.R命令  查看、修改寄存器内容

2.D命令  用于查看内存内容(从数据角度)

3.E命令  用于改写内存内容(从数据角度)

4.U命令  用于查看内存内容(从指令角度)

5.A命令  用于改写内存内容(从指令角度)

6.T命令  执行指令

7.P命令

8.G命令  跳转到某条指令

9.其它

总结


前言

在学习完王爽老师《汇编语言》(第四版)第六章之后,我决定整理一下masm5.0与debug命令的使用方法,方便之后回顾。(我使用的环境是DosBox。)


一、汇编程序的代码框架

以下是汇编程序基本规范。其中也包含了一些小知识点。注释符号我借用了java语言中的“//”。

assume cs:code     //开头使用关键字assume,并且要将段寄存器与段名关联
 
  a segment       //数据、代码、栈 要分段存放,段用“段名 segment”开头,用“段名 ends”结尾
  db 1,2,3,4,5,6,7,8    //db 为8字节型数据申请空间(byte),或理解为定义了8个字节型数据
  a ends            //不足16字节的,系统会分配16字节的空间来存放

  b segment
  dw 0123H,0456H,0789H,0abcH    //汇编中数据不能以字母开头,如“a234H”就要写成“0a234H”
  b ends

  c segment    //栈段 要开辟一定的空间作为栈使用
  dw 0,0,0,0,0,0,0,0    //dw 开辟4个字型数据的空间(word),或理解为定义了4个字型数据
  c ends
  
  code segment     //代码段,code是标识符,不是关键字
  start:           //start是标识符,上下呼应,标识程序入口,即cs:ip指向处
      mov ax,11H     //H标识十六进制,也可以用十进制

      mov cx,8    //通常在循环之前,用cx保存循环次数
      s:              //s是标号,标识一段循环体,上下呼应
          add ax,10H
      loop s             //CPU执行cx-1后若≠0,则跳到标号s所在处执行,否则继续向下执行

      mov ax,4c00H    //这两行作用是 程序返回 ,这是汇编程序的规范
      int 21H
  code ends    //代码段结束

end start      //end是程序结束。  start是标识符,标识程序入口

二、使用masm生成exe文件

1.编译

将写好代码的源程序保存为 文件名.asm文件,然后在DosBox中编译。

编译最简单的方法就是在DosBox中输入  masm 文件名 ; 回车。如下。

masm 1;

如果不加分号,那么连续回车就可以,中间步骤生成的中间文件,现在不必去管它。

这一步是在当前文件夹下生成.obj文件。

没有指明路径是因为源程序1.asm与masm5.0放在同一文件夹下。如果源程序放在别处,就要指明路径。

2.连接

最简单的方法就是在DosBox中输入 link 文件名 ; 回车。如下。

link 1;

如果不加分号,就要多回车几次。中间生成的中间文件,现在不必去管它。

这一步是在当前文件夹下生成.exe文件。

同理,没有指明路径是因为1.obj与link.exe放在同一文件夹下,否则要指明路径。

三、使用debug调试程序

在DosBox中可以直接运行exe程序,如下。

1.exe

但更多时候需要使用debug进行分步调试。调试方法是,在DosBox中输入 debug 文件名.exe 回车。如下。

debug 1.exe

四、debug命令小结

1.R命令  查看、修改寄存器内容

(1)查看CPU寄存器的内容

R  回车

(2)改变CPU寄存器的内容

例如将段寄存器DS的值改为2000H:   

R DS 回车,  2000 回车(输入目标值)

 

2.D命令  用于查看内存内容(从数据角度)

(1)D回车,查看默认地址的内容

(2)D 段地址:偏移地址 回车,查看指定地址的内容,如 D 2000:0   。

(3)段地址可以使用段寄存器名,如  D ds:0002  。

(4)可以指定查看范围,D 段地址:起始偏移地址 结尾偏移地址 ,如 D 1000:0 f   。

3.E命令  用于改写内存内容(从数据角度)

(1)E 段地址:起始偏移地址 数据 数据 数据 ...    ,用空格分隔数据,用回车来退出修改。

(2)用提问的方式一个字节一个字节地改写。E 段地址:偏移地址 回车,(屏幕显示原有数据)然后输入新数据,回车。

(3)用第一种方式还可以写入字符或字符串。注意定界符,字符如'a',字符串如"Hello"。

 

4.U命令  用于查看内存内容(从指令角度)

即查看内存内容对应的汇编指令。

与D命令相同的使用方式,只不过查看角度不同而已。

如 U ds:0 回车,查看 ds:0000处开始的汇编指令。

 

5.A命令  用于改写内存内容(从指令角度)

即方便地输入汇编指令存储在内存中。

注意,指令必须一行一行地输入。输入一条指令之后要回车。最后以回车结束输入。

(1)a 回车,从默认地址开始输入指令。

(2)a 段地址:偏移地址 回车,从指定地址开始输入指令。

6.T命令  执行指令

用于执行cs:ip当前指向的那条指令。(IP寄存器将自动改写。)

7.P命令

(1)遇到程序返回语句 int 21H 时,要用P命令而不是T命令执行。

(2)遇到loop循环语句时,使用P命令可以自动执行完整个loop(也就是执行到cx=0),而不用一步步执行。

8.G命令  跳转到某条指令

用于跳到某一条指令处,例如 G 0012 回车,即表示设置IP=0012H。

9.其它

alt+Enter可以全屏/恢复 窗口大小。


总结

本文总结了汇编程序的基本框架及规范、masm5工具的基本使用方法、debug命令的基本使用方法。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐