問題描述
劊子手游戲,語法修復 x86 gcc 程序集和 C (hangman game, syntax fix x86 gcc assembly & C)
我的最終項目是一個劊子手游戲。所選單詞是從數據庫中隨機挑選的。用戶通過 scanf
輸入一個 char
,然後必須通過彙編與所選單詞進行比較。由於 C
沒有字符串變量,字符串只是一個字符數組,所以輸入的 char
在 for 循環
中,必須與每個字符進行比較數組中的索引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 */