保持寄存器和输入寄存器的区别_Assembly 输入输出和调试

输入和输出

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

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

bd2a3049e13c84dcf9af3f7aab97f9cd.png

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

%include "asm_io.inc"

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

d9926362956f8fefaf4b10c0f17d44bc.png

调试

作者的库同样包含一些有用的调试程序。这些调试程序显示关于系统状态的信息但不改变它们。这些程序是一些保存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做的一样。

e26452337be287fb8e8ec549e18102ad.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值