【问题标题】:How to print the following in NASM assembler?如何在 NASM 汇编器中打印以下内容?
【发布时间】:2014-04-03 02:01:44
【问题描述】:

我仍在学习如何使用 NASM,所以我的问题中可能存在一些语法错误。无论如何,当我创建标签时,假设

buf: resb 16

然后,标签buf 包含指向保留的16 个字节中的第一个的内存地址。然后,我想打印从这 16 个字节中的任意字节到最后一个字节的所有内容,例如,打印字节 13 到 16。然后代码看起来像

mov eax, 4
mov ebx, 1
mov ecx, buf + 12
mov edx, 4         ;; for the 4 bytes to be read 
int 80h

这是正确的吗?然后,我真正想做的是

some_number:     resb 1

mov [some_number], byte 3

mov eax, 4
mov ebx, 1
mov ecx, buf + 16 - [some_number]
mov edx, byte [some_number]         ;; for the 3 bytes to be read, in this case 
int 80h

所以我想传递地址 buf + (16 - 3),即 buf + 13。但这绝对行不通。如果这是错误的,或者是否有更好的方法来实现这一点,请告诉我。

顺便说一句,some_number 将由任意进程确定,因此每次我的程序运行时都会有所不同。

【问题讨论】:

  • 显示您的打印方式?否则无法知道这些寄存器是否正确。
  • 对不起,我忘了包括系统中断。我想写入标准输出。

标签: assembly nasm


【解决方案1】:

mov ecx, buf + 12 无效,但您可以使用 lea ecx, [buf + 12] 来实现,这几乎是“加载 buf + 12 的有效地址”,这就是您想要的。

虽然有效地址格式确实允许寄存器,但它不允许间接或减法,因此lea ecx, [buf + 16 - [some_number]] 将双重无效。您必须在单独的步骤中进行减法,注意使用正确的操作数大小。一种选择是:

lea ecx, [buf + 16]
movzx eax, byte [some_number]
sub ecx, eax

如果您的 some_number 是双字而不是字节,您可以将其简化为:

lea ecx, [buf + 16]
sub ecx, [some_number]

【讨论】:

    猜你喜欢
    • 2011-10-17
    • 2015-09-16
    • 2018-05-14
    • 2015-09-17
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多