4.1 ~ 4.9

2020-03-10
2020-03-10
3 min read
Hits

  《汇编语言(第3版)》4.1 ~ 4.9、《零基础入门学习汇编语言》P20 ~ 22

第四章 第一个程序

4.2 源程序

4.2.1 定义一个段

  segment 和 ends 是一对成对使用的伪指令,这是在写可被编译器编译的汇编程序时,必须要用到的一对伪指令。

  segment 和 ends 的功能是定义一个段,segment 说明一个段开始,ends 说明一个段结束。

  一个段必须有一个名称来标识,使用格式为

  1. 段名 segment
  2. 段名 ends

  End 是一个汇编程序的结束标记,编译器在编译汇编程序的过程中,如果碰到了伪指令 end,就结束对源程序的编译。

  如果程序写完了,要在结尾处加上伪指令 end。否则,编译器在编译程序时,无法知道程序在何处结束。

注意 end 和 ends 的区别。ends 只是段的结束,而 end 是整个程序的结束。

  assume:含义为“假设”。

  它假设假设某一段寄存器和程序中的某一个用 segment…ends 定义的段相关联。通过 assume 说明这种关联,在需要的情况下,编译程序可以将段寄存器和某一个具体的段相联系。

目的相关指令指令性质指令执行者
通知编译器一个段结束段名 ends伪指令编译时,由编译器执行
通知编译器程序结束end伪指令编译时,由编译器执行
程序返回mov ax,4c00H int 21H汇编指令编译时,由 CPU 执行

4.2.2 标号

  一个标号指代了一个地址。

  放在 segment 的前面,作为一个段的名称,这个段的名称最终将被编译、连接程序处理为一个段的段地址。

总结

  程序加载后,ds 中存放着程序所在内存区的段地址,这个内存区的偏移地址为 0,则程序所在的内存区的地址为:ds:0;

  这个内存区的前 256 个字节中存放的是 PSP,dos 用来和程序进行通信。

  从 256 字节处向后的空间存放的是程序。

  所以,我们从 ds 中可以得到 PSP 的段地址 SA,PSP 的偏移地址为 0,则物理地址为 SA×16+0。

  因为 PSP 占 256(100H)字节,所以程序的物理地址是:SA×16+0+256=SA×16+16×16=(SA+16)×16+0

  可用段地址和偏移地址表示为:SA+10:0。

4.9 程序执行过程的跟踪

debug 命令使用

  用 U 命令查看一下其他指令

  用 T 命令单步执行程序中的每一条指令,并观察每条指令的执行结果

  到了 Int 21,我们要用 P 命令执行。int 21 执行后,显示“Program terminated normally”,返回到 Debug 中。

DOS 程序执行过程

  需要注意的是,在 DOS 中运行程序时,是 command 将程序加载入内存;

  所以程序运行结束后返回到 command 中,而在这里是 debug 将程序加载入内存,所以程序运行结束后要返回到 Debug 中。

  使用 Q 命令退出 Debug,将返回到 command 中,因为 Debug 是由 command 加载运行的。

DOS 程序执行过程举例

  我们在 DOS 中用“Debug 1.exe”运行 Debug 对 1.exe 进行跟踪时,程序加载的顺序是:command 加载 Debug,Debug 加载 1.exe。

  返回的顺序是:从 1.exe 中的程序返回到 Debug,从 Debug 返回到 command。

Avatar

Hui.Ke

❤ Cyber Security | Safety is a priority.
Previous 5.1 ~ 5.4