内联汇编 - 使用printf以十进制显示寄存器?

时间:2014-11-25 23:23:53

标签: c++ assembly printf inline-assembly

我刚才有一个非常快速的问题,我看到有人在另一个问题中提到了一些问题,但我并不想对它进行死讯。

我用c ++编写内联汇编代码,需要以十进制显示寄存器值。我正在寻找这样做的方法,看到有人提到"如果您正在使用内联c,请拨打printf。"但他们并没有进一步解释它。

是否可以使用call printf来获取十进制格式的寄存器值,而无需编写代码的转换部分?如果是这样,那将如何运作?在对用户输入的整数进行一些计算后,该值现在位于AX寄存器中。我会简单地将调用printf放在代码之后吗?或者它是否从堆栈中打印出值?或者甚至可能做类似的事情:

AX printf

对于我对此的无知,我道歉,我们的书不涉及内联汇编,我想避免编写一大段代码来转换,如果可以的话。另外,我似乎无法找到关于printf如何工作的答案。谢谢你的帮助,我真的很感激!

2 个答案:

答案 0 :(得分:3)

最简单的方法是使用内联汇编程序将寄存器复制到某个变量,然后打印该变量。

short registerValue;
__asm mov registerValue, ax;
printf("ax: %hd", registerValue);

确切的汇编程序调用将取决于您的编译器和语法;以上可能不会使用除cl之外的编译器。

如果你想从汇编程序实际调用printf,你需要弄清楚它的调用约定以及调用约定如何传递可变参数函数。

答案 1 :(得分:0)

根据编译器的不同,可能存在直接访问寄存器的预定义伪符号。 Turbo C及其后代特别方便:

 _some_magic_function ();
 printf ("es:bx = %0x:%0x\n", _ES, _BX);