劊子手游戲,語法修復 x86 gcc 程序集和 C (hangman game, syntax fix x86 gcc assembly & C)


問題描述

劊子手游戲,語法修復 x86 gcc 程序集和 C (hangman game, syntax fix x86 gcc assembly & C)

我的最終項目是一個劊子手游戲。所選單詞是從數據庫中隨機挑選的。用戶通過 scanf 輸入一個 char,然後必須通過彙編與所選單詞進行比較。由於 C 沒有字符串變量,字符串只是一個字符數組,所以輸入的 charfor 循環 中,必須與每個字符進行比較數組中的索引char

現在傳遞彙編函數:int i(索引#),char string1指針(數組字)和char string2指針(用戶輸入) .

movb    8(%ebp), %ecx   /*store i ‑> cx reg*/
movb    12(%ebp),%ebx   /*store *string1 ‑> bh reg*/
movb    16(%ebp),%edx   /*store (userinput)*string2 ‑>bl reg*/
movb    (%ebx,%ecx,1),%al
movb    (%ebx,%ecx,1), %ah
movl    $0,     %eax
cmpl    %al,    %ah
jne     end
movl    $1,     %eax

我知道這兩行語法不正確,我需要知道如何正確偏移這些 mov 指令。另外,如果還有其他錯誤。這應該是在偏移後比較兩個寄存器。我是組裝新手。

movb    (%bh,%cx,1),%edx
movb    (%bl,%cx,1), %eax

編輯:所以現在比較兩個字符時它只給我返回 1,即使它們不同。


參考解法

方法 1:

You cannot use 8‑bit or 16‑bit registers such as %bh, %bl and %cx as address and/or index registers in 32 bit mode. You should use %ecx, %ebx and %edx as pointer and index registers, and use %al and %ah to load bytes from the strings:

movl    8(%ebp),%ecx    /* store 32 bit i ‑> ecx reg */
movl    12(%ebp),%ebx   /* store string1 ‑> ebx reg */
movl    16(%ebp),%edx   /* store (userinput) string2 ‑> edx */
movb    (%ebx,%ecx,1),%al
movb    (%edx,%ecx,1),%ah
cmpb    %al,%ah
jne     here
movl    $0,%eax
jmp     end

If i has type unsigned char on the C side, you must zero extend the 8 bit value this way:

movzbl  8(%ebp),%ecx    /* store 8 bit i ‑> ecx reg */

(by Riker chqrlie)

參考文件

  1. hangman game, syntax fix x86 gcc assembly & C (CC BY‑SA 2.5/3.0/4.0)

#assembly #GCC #cpu-registers #C #arrays






相關問題

內聯彙編 - cdecl 和準備堆棧 (Inline assembly - cdecl and preparing the stack)

ASM 使用代碼查找偏移量 (ASM find offset with code)

顯示字符的 Ascii 值 (Displaying Ascii values of characters)

x86 彙編程序崩潰,可能忽略了簡單的錯誤 (x86 assembly procedure crashes, possibly overlooking simple error)

是否可以在 C++ 結構中編寫靜態程序集數據? (Is it possible to write static assembly data in C++ struct?)

將小於 %ecx 的 1 推入堆棧 (push 1 less than %ecx to stack)

emu8086 : ARR 不包含任何值 (emu8086 : ARR do not contain any value)

劊子手游戲,語法修復 x86 gcc 程序集和 C (hangman game, syntax fix x86 gcc assembly & C)

如何將內存中的 96 位加載到 XMM 寄存器中? (How to load 96 bits from memory into an XMM register?)

如何使用 Assembly 中的 printf? (How do you use printf from Assembly?)

摩托羅拉 68HC12 實時中斷寄存器 (Motorola 68HC12 Real Time Interrupt Registers)

我可以用 OR 操作代替 MOV 操作嗎? (Can I substitute a MOV operation with an OR operation?)







留言討論