Assembly 仅在寄存器x86程序集中存储第一个字节

Assembly 仅在寄存器x86程序集中存储第一个字节,assembly,memory-management,x86,nasm,Assembly,Memory Management,X86,Nasm,我试图在数据被传递到寄存器后,只在寄存器中存储第一个字节 例如,如果我有以下ASM代码 global _start section .data string db "Hello", 0x00 ; string = Hello section .text _start: mov eax, string ; move "Hello" into eax (just to store it for now) 这就是我被卡住的地方,我只想将“H”存储到eax中,因此,例如,如果我将“H”移动到eax中,

我试图在数据被传递到寄存器后,只在寄存器中存储第一个字节 例如,如果我有以下ASM代码

global _start
section .data
string db "Hello", 0x00 ; string = Hello
section .text
_start:
mov eax, string ; move "Hello" into eax (just to store it for now)
这就是我被卡住的地方,我只想将“H”存储到eax中,因此,例如,如果我将“H”移动到eax中,然后将eax移动到edx中,因此edx=“H”,我可以执行以下操作:

mov ebx, 1
mov ecx, edx ; This is so I can store "H" in ecx
mov edx, 12 ; 12 is longer than the string, however, I am just using this to test, as it should only output "H", rather than anything else, the reason for this is later I want to use "H" in a  cmp statement
int 0x80 ; execute the system call

现在,我也尝试在将字符串移动到eax后使用al,例如:
mov[edx],al
,但这仍然会输出完整的字符串,如果可以为此提供一个工作示例,将非常感谢将字符串的第一个字节移动到
al
(这是
eax
的最低字节),使用

如果您想将字节移到eax的低位字节,并将eax的其余部分归零,您可以这样做

movzx eax, byte [string]
但是您不必为此使用EAX。您可以将字节加载到所需的任何寄存器中。具体地说,EAX可能是一个错误的选择,因为
int80h
需要那里的系统调用号。从粘贴的代码中看不出您在之后试图对“H”字符做什么


如果您打算使用
write
syscall(#4)和
stdout
文件描述符(1)将字符串打印到控制台,这听起来很自然,那么,正如fuz所说,您不需要将字符串的内容加载到任何寄存器中;系统调用需要字符串的地址,而不是其内容。据我所知,Linux中没有单字符输出



一般来说,您似乎混淆了字符串的地址和字符串上的内容。

要将字符串的第一个字节移动到
al
(这是
eax
的最低字节),请使用

如果您想将字节移到eax的低位字节,并将eax的其余部分归零,您可以这样做

movzx eax, byte [string]
但是您不必为此使用EAX。您可以将字节加载到所需的任何寄存器中。具体地说,EAX可能是一个错误的选择,因为
int80h
需要那里的系统调用号。从粘贴的代码中看不出您在之后试图对“H”字符做什么


如果您打算使用
write
syscall(#4)和
stdout
文件描述符(1)将字符串打印到控制台,这听起来很自然,那么,正如fuz所说,您不需要将字符串的内容加载到任何寄存器中;系统调用需要字符串的地址,而不是其内容。据我所知,Linux中没有单字符输出



通常,您似乎混淆了字符串的地址和字符串上的内容。

mov[edx],al
将al中的字节存储到edx指向的内存位置。这太离谱了。请注意,写入系统调用需要一个指向缓冲区的指针。如果将一个字符加载到寄存器中,它将不会达到您所期望的效果。@SevaAlekseyev如果我执行
全局开始部分。数据字符串db“testing”,0x00部分。文本开始:xor eax,eax mov eax,string mov[edx],al mov eax,4 mov ebx,1 mov ecx,edx mov edx,12 int 0x80 mov eax,1 mov ebx,0 int 0x80
它返回一个segfault,有什么想法吗?我的眼睛。下次编辑问题。无论如何,在
mov[edx]中,al
尝试将一个字节写入edx指向的内存位置。EDX包含垃圾。这是您的segfault。
mov[edx],al
将al中的字节存储到edx指向的内存位置。这太离谱了。请注意,写入系统调用需要一个指向缓冲区的指针。如果将一个字符加载到寄存器中,它将不会达到您所期望的效果。@SevaAlekseyev如果我执行
全局开始部分。数据字符串db“testing”,0x00部分。文本开始:xor eax,eax mov eax,string mov[edx],al mov eax,4 mov ebx,1 mov ecx,edx mov edx,12 int 0x80 mov eax,1 mov ebx,0 int 0x80
它返回一个segfault,有什么想法吗?我的眼睛。下次编辑问题。无论如何,在
mov[edx]中,al
尝试将一个字节写入edx指向的内存位置。EDX包含垃圾。这是你的错误。问题被标记为#nasm,因此确切的语法是
movzx eax,byte[string]
(no
ptr
关键字)。对不起,MASM反射。已修复。问题被标记为#nasm,因此确切语法为
movzx eax,byte[string]
(no
ptr
关键字)。抱歉,MASM反射。固定的。