Assembly 输入输出和调试

2018-10-26 10:39 更新

输入和输出

输入和输出是真正系统依赖的活力。它牵涉到系统硬件的接口问题。高级语言,像C,提供了标准的,简单的,统一的程序I/O接口的程序库。汇编语言不提供标准库。它们必须要么直接访问硬件(在保护模式下为特权级操作)或使用任何操作系统提供的底层的程序。

汇编程序与C交互使用是非常普遍的。这样做的一个优点是汇编代码可以使用标准C I/O程序库。但是,你必须清楚C使用的程序之间传递信息的规则。这些规则放在这会非常麻烦。(它们将在以后提到!)为了简单化I/O,作者已经开发出了隐藏在复杂C规则里的自己的程序,而且提供了一个更简单的接口。

汇编的I/O程序

表1.4描述了提供的程序。所有这些程序保留了所有寄存器的值,除了读的程序外。这些程序确实修改了EAX 的值。为了使用这些程序,你必须包含一个汇编程序需要用到的信息的文件。为了在NASM
中包含一个文件,你可以使用%include预处理指示符。下面几行包含了有作者的I/O程序的文件:

%include "asm_io.inc"

为了使用一个打印程序,你必须加载正确的值到EAX 中,然后用CALL指令调用它。CALL指令等价于在高级语言里的函数call。它跳转到代码的另一段去执行,然后等程序执行完成后又回到原始的方。下面的程序例子展示了调用这些I/O程序的几个样例。

Assembly

调试

作者的库同样包含一些有用的调试程序。这些调试程序显示关于系统状态的信息但不改变它们。这些程序是一些保存CPU的当前状态后执行一个子程序调用的宏。这些宏定义在上面提到的asm io.inc文件中。宏可以像普通的指令一样使用。宏的操作数由逗号隔开。

这儿有四个调试程序称为dump regs,dump mem,dump stack和dump math;
它们分别显示寄存器,内存,堆栈和数字协处理器的值。

dump regs 这个宏显示系统的寄存器里的值(十六进制)到stdout(也就是: 显示器)。它同时显示在FLAGS9寄存器里的位。例如,如果零标志位是1,ZF是显示的。如果是0,它就不被显示。它携带一个整形参数,这个参数同样被显示出来。这就可以用来区别不同dump regs命令的输出。

dump mem 这个宏同样以ASCII字符的形式显示内存区域的值(十六进制)。它带有三个用逗号分开的参数。第一个参数是一个用来标示输出的整形变量(就像dump regs参数一样)。第二个参数需要显示的内存的地址。(它可以是个标号。)最后一个参数是在此地址后需要显示的16字节的节数。内存显示将从要求的地址之前的第一节的边界开始。

dump stack 这个宏显示CPU堆栈的值。(这个堆栈将在第4章中提到。)这个堆栈由双字组成,所以这个程序也以这种格式显示它们。它带有三个用逗号隔开的参数。第一个参数是一个整形变量(像dump regs一样)第二个参数是在EBP寄存器里的地址下面需要显示的双字的数目而第三个参数是在EBP寄存器里的地址上面需要显示的的数目。

dump math 这个宏显示数字协处理器寄存器里的值。它只带有一个整形参数,这个参数用来标示输出就像参数dump regs做的一样。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号