【问题标题】:Store only first byte in a register x86 Assembly仅将第一个字节存储在寄存器 x86 程序集中
【发布时间】:2020-09-16 00:47:47
【问题描述】:

我试图在数据传入后仅将第一个字节存储在寄存器中 例如,如果我有以下 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

现在我也尝试使用 al,例如:mov [edx], al 将字符串移动到 eax 后,但这仍然会输出完整的字符串,如果可以为此提供工作示例,将不胜感激

【问题讨论】:

  • mov [edx], al 将 AL 中的字节存储到 EDX 指向的内存位置。这已经很遥远了。
  • 请注意,写系统调用需要一个指向缓冲区的指针。将字符加载到寄存器中时,它不会像您期望的那样。
  • @SevaAlekseyev 如果我这样做global _start section .data string db "testing", 0x00 section .text _start: 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 它返回一个段错误,有什么想法吗?
  • 我的眼睛。下次编辑问题。无论如何,在mov [edx],al 中,您尝试将一个字节写入 EDX 指向的内存位置。 EDX 包含垃圾。那是你的段错误。
  • 相反的问题,加载一个字节,是How to load a single byte from address in assembly(这里的Seva的回答似乎是在回答这个问题。)

标签: assembly memory-management x86 nasm


【解决方案1】:

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

mov al, [string]

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

movzx eax, byte [string]

但您不必为此使用 EAX。您可以将字节加载到您想要的任何寄存器中。具体来说,EAX 可能是一个糟糕的选择,因为int 80h 期望那里有系统调用号。从粘贴的代码中并不能立即看出你想用那个“H”字符做什么......


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


一般来说,您似乎对字符串的地址和字符串上的内容感到困惑。

【讨论】:

  • 问题被标记为#nasm,所以确切的语法是movzx eax, byte [string](没有ptr关键字)。
  • 抱歉,MASM 反应迟钝。固定。
猜你喜欢
  • 1970-01-01
  • 2013-10-23
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 2019-04-21
  • 2012-11-05
相关资源
最近更新 更多