簡體   English   中英

推送操作時出現“錯誤:未指定操作大小”。 總成 x86

[英]"error: operation size not specified" on push operation. Assembly x86

我正在嘗試制作一個簡單的 x86 程序來反轉字符串,在本例中為:“ciao”。

section .data
        msg db "ciao"
        len equ $ - msg

section .text
global _start
_start:
        lea eax, [msg]
        mov ebx, len
        add eax, ebx-1
reverseloop:
        push [eax]
        sub eax, 1
        cmp eax, [msg]
        jl reverseloop

當我嘗試組裝它時,出現錯誤:

main.asm:14: 錯誤:未指定操作大小

因此,我嘗試通過將第 14 行修改為:

push byte [eax]

現在我得到了錯誤:

main.asm:14: 錯誤:操作碼和操作數的組合無效

我真的不明白這里有什么問題。
我用來編譯的命令是:

nasm -f elf32 main.asm -o main.o

 push [eax]

NASM 不知道您要推送的 memory 操作數的大小。 您需要將其指定為push dword [eax]
使用push byte [eax]不是一個選項,因為堆棧操作不執行單個字節。

 add eax, ebx-1

這是你的下一個錯誤! 源操作數ebx-1無效。
您可以先遞減 EBX,然后將其添加到 EAX,但正如我將在下面展示的那樣,您不需要這種遞減。

 cmp eax, [msg] jl reverseloop

這也不是你想要的。 cmp將 EAX 與來自 memory 的雙字進行比較,但您希望這是地址之間的比較。 使用cmp eax, msg
為了繼續循環字符串的所有字符,只要 EAX 中的地址為GreaterOrEqual msg ,就需要有條件地跳轉。

  mov   eax, msg
  add   eax, len
reverseloop:
  dec   eax
  movzx ebx, byte [eax]
  push  ebx
  cmp   eax, msg
  ja    reverseloop

現在我看不出這段代碼如何逆轉任何事情。 這些字符以與 memory 中相同的順序落在堆棧上(當然散布着一些零字節)。

  mov   eax, msg
  mov   ecx, len
reverseloop1:
  movzx ebx, byte [eax]
  push  ebx
  inc   eax
  dec   ecx
  jnz   reverseloop1

  mov   eax, msg
  mov   ecx, len
reverseloop2:
  pop   ebx
  mov   [eax], bl
  inc   eax
  dec   ecx
  jnz   reverseloop2

不使用堆棧的解決方案存在並且通常會更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM