2014-03-02 35 views
0

我仍然在学习如何使用NASM,因此在我的问题中可能会出现一些语法错误。无论如何,当我创建一个标签,假设如何在NASM汇编器中打印以下内容?

buf: resb 16 

然后,标签buf包含指向第一个被保留了16个字节的内存地址。然后,我想从这些16到最后一个任意字节打印的一切,比如,通过16打印字节13然后代码会看起来像

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

展示你是如何打印?没办法知道这些寄存器否则是正确的。 – TypeIA

+0

对不起,我忘记了包含系统中断。我想写入标准输出。 –

回答

3

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是一个DWORD不是一个字节,你可以简化到:

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