【问题标题】:How can I print numbers in my assembly program如何在我的汇编程序中打印数字
【发布时间】:2016-12-05 16:50:05
【问题描述】:

我的汇编程序有问题。我的汇编编译器是 NASM。源和输出在这张图片中:

问题是我无法使用extern C 函数printf() 打印计算中的数字。我该怎么做?

输出应该是“Ergebnis: 8”,但它不正确。

【问题讨论】:

  • 你的程序是什么让你认为它应该打印一个 8?
  • val_1 和 val_2 都是 4。我在 eax 中 mov(e) val_1 并将 val_2 添加到 eax 然后我将它与结果字符串一起推入堆栈。在 C:: int a = 4; 中是这样的诠释 b = 4; printf("Ergebnis: %i", a + b);
  • mov eax, val_1 不做,你认为它做。检查调试器中的反汇编。 NASM 确实使用正确的 Intel 语法,所以如果你想从内存中获取值,你必须使用[] 方括号来指定。而val_1: 不是“变量名”,而是“指向具有第一个字节地址的内存的指针”。加上在标签名称后使用冒号,即使在.data 定义中,它也可以使您免于其他晦涩的编译问题(当您不小心碰到指令助记符时)。
  • 你是如何编译这张图片中的代码的?我的编译器只给出错误。
  • 我不了解你,但我的汇编器不接受 .png 文件作为源输入。也许您应该将代码发布为纯文本

标签: windows assembly x86 nasm


【解决方案1】:

NASM documentation 中指出NASM 需要方括号用于内存引用。当您编写不带括号的标签名称时,NASM 会给出其内存地址(或有时称为偏移量)。所以,mov eax, val_1 意味着eax 寄存器获得了val_1 的偏移量。当您 add eax, val_2 时,val_2 偏移量被添加到 val_1 偏移量,您会得到您所看到的结果。

改写:

mov eax, [val_1]
add eax, [val_2]

你应该在 eax 中得到8

附:看来您刚刚从MASMTASM 切换到NASM。 对于像你这样的切换者,有很多指南。例如,请参阅不错的教程 herehere

【讨论】:

  • 你似乎知道 OP 的程序出了什么问题,但你只是重写了同样的错误!你为什么不写mov eax, [val_1]add eax, [val_2]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-15
  • 2013-06-25
  • 1970-01-01
相关资源
最近更新 更多