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