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

Assembly 如何在NASM汇编程序中打印以下内容?,assembly,nasm,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

我还在学习如何使用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。但这肯定行不通。让我知道这是否是错误的,或者是否有更好的方法来实现这一点


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

mov ecx,buf+12
是无效的,但您可以通过使用
leaecx,[buf+12]
来实现这一点,它相当于“加载buf+12的有效地址”,这就是您想要的

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

lea ecx, [buf + 16]
movzx eax, byte [some_number]
sub ecx, eax
如果您的
某个数字是dword而不是字节,您可以将其简化为:

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

mov-ecx,buf+12
是无效的,但是您可以通过使用
lea-ecx,[buf+12]
来实现这一点,它相当于“加载buf+12的有效地址”,这就是您想要的

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

lea ecx, [buf + 16]
movzx eax, byte [some_number]
sub ecx, eax
如果您的
某个数字是dword而不是字节,您可以将其简化为:

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

mov-ecx,buf+12
是无效的,但是您可以通过使用
lea-ecx,[buf+12]
来实现这一点,它相当于“加载buf+12的有效地址”,这就是您想要的

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

lea ecx, [buf + 16]
movzx eax, byte [some_number]
sub ecx, eax
如果您的
某个数字是dword而不是字节,您可以将其简化为:

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

mov-ecx,buf+12
是无效的,但是您可以通过使用
lea-ecx,[buf+12]
来实现这一点,它相当于“加载buf+12的有效地址”,这就是您想要的

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

lea ecx, [buf + 16]
movzx eax, byte [some_number]
sub ecx, eax
如果您的
某个数字是dword而不是字节,您可以将其简化为:

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

展示你是如何印刷的?否则无法知道这些寄存器是否正确。对不起,我忘了包括系统中断。我想写入标准输出。演示如何打印?否则无法知道这些寄存器是否正确。对不起,我忘了包括系统中断。我想写入标准输出。演示如何打印?否则无法知道这些寄存器是否正确。对不起,我忘了包括系统中断。我想写入标准输出。演示如何打印?否则无法知道这些寄存器是否正确。对不起,我忘了包括系统中断。我想写入标准输出。