如何在NASM汇编程序中打印以下内容?

时间:2014-03-02 01:32:53

标签: assembly nasm

我还在学习如何使用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将由一个任意进程决定,因此每次我的程序运行时都会有所不同。

1 个答案:

答案 0 :(得分:3)

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

虽然有效地址格式允许寄存器,但它不允许间接或减法,因此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]
相关问题