今天学习内容
目录
:
1.程序的跟踪和调试
在debug命令下调试运行程序
1.反汇编语言U
将exe文件反汇编为汇编语言
第一列就是我们常说的CS:IP即段基址:偏移地址
(顺带一提物理地址=段基址*10H+偏移地址)
第二列是机器码,每一行的偏移地址的增量即为上一条命令所占的内存单元
第三列是汇编语言指令
2.执行程序命令G
命令格式为G=[起始地址][中止地址]
中止地址是为了给程序设置断点让程序停在某个位置便于观测
不做任何赋值则自动从0000H执行到最后一个命令
注意两个地址之间要加空格哈
3.跟踪程序命令T
命令格式为T=[起始地址] [指令条数]用于单步执行程序
注意此时命令执行后的AX发生了变化(由076B变为076A说明第一条指令完成)
IP由0000变为0003,意味着下一条指令位于0003H处(说明IP总是指向下条将执行的指令)
注意:int指令不能使用t指令跟踪
这样会使程序进入一个陌生的系统程序
4. 单步执行程序命令P
为了解决T不能执行int之类的命令而推出的
使用方式和t命令一模一样
P命令用以执行循环、重复的字符串指令、软件中断或子例程
(遇到子程序的时候直接执行完子程序而不会进入)
5.输入汇编指令A
命令方式为-A 起始地址
然后每输入一行按enter键(输入有错误会显示error)
写入完毕后最后一行不输入直接按enter键(CTRL+C组合键也可)退出A命令
A命令按行汇编,用于小段程序的汇编和对目标程序的修改
像我这样就会在程序中输出两次"I LOVE CHINA"
6.退出命令Q
用Q命令退出debug(这就不用展示了)
2.常用的debug命令
1.查看/改变CPU寄存器内容的R指令
该命令可以查看cpu各寄存器中的内容(CS和IP的内容即指向了下一条要读取的指令所在的内存)
如果要改变寄存器中的内容,可以使用 R 寄存器名称
这里就对AX中的内容进行了修改
2.查看内存中的内容的D命令
这里一开始搞得不是很懂,内存和寄存器内容的区别
所以找了一位佬的总结:寄存器、缓存、内存之间的关系和区别_缓存和内存是一一对应关系吗-优快云博客
D命令的命令格式是这样D 段基址:偏移地址
debug会从指定的内存单元开始的128个内存单元列出来
注意我这里的区别(076A和076B):
分别是AX赋值前后的段基址,所以076B开始的内存单元并没有存储字符串相关的内容
分为三部分:
1.左侧是每行的起始逻辑地址
2.中间是之前所说的128个内存单元的内容(16进制)
(每一行显示16个内存单元中的内容即16进制的每16进1,共有7行)
3.右侧是每个内存单元中数据对应的ASCII字符(如果没有对应的就显示.)
3.改写内存中内容的E命令
这个命令感觉对新手不是很友好
命令格式是E 起始地址 数据 数据 数据 .....
这里我从076A:000D 地址开始改变了14个单元的内容
3常用的DOS功能调用
计算机系统设计的简单I/O子程序,感觉和<iostream>差不多(有错误可以在评论区纠正哈)
DOS功能调用 INT 21H功能的使用方法:
1.将调用功能的功能号(下表由一些常用的功能号)存入AH寄存器
2.如果有必要的话需要设置调用参数
3.执行INT 21H指令
4.如有必要,按规定取得返回参数
AH | 功能 | 调用参数 | 返回参数 |
01H | 键盘输入单个字符并回显 | 无 | AL=输入字符 |
02H | 输出单个字符 | DL=输入字符 | 无 |
07H | 键盘输入(无回显) | 无 | AL=输入字符 |
09H | 显示字符串 | DS:DX=串地址 字符串以$结束 | 无 |
09H | 键盘输入缓冲区 | DS:DX=缓冲区首地址 (DS:DX)=缓冲区字节数 | (DS:DX+1)=实际字节数 (DX:DX+2)=输入的串地址 |
4CH | 程序结束 | AL=返回码 | 无 |
这些常用功能等我学会怎么自己写汇编程序再补上说明(呜呜呜,太菜了)