刽子手游戏,语法修复x86 gcc assembly& 13 C

时间:2015-12-07 08:00:47

标签: c arrays gcc assembly cpu-registers

我的最后一个项目是一个刽子手游戏。从数据库中随机选取所选单词。用户通过char输入scanf,然后必须通过程序集与所选单词进行比较。因为C没有字符串变量,字符串只是一个字符数组,因此输入的char位于for loop中,必须与数组中的每个索引char进行比较。

现在传递汇编函数:int i(index#),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

编辑:所以现在它只是在比较2个字符时给我一个1的回报,即使它们不同。

1 个答案:

答案 0 :(得分:0)

在32位模式下,不能使用%bh%bl%cx等8位或16位寄存器作为地址和/或索引寄存器。您应该使用%ecx%ebx%edx作为指针和索引寄存器,并使用%al%ah从字符串加载字节:

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

如果i在C端具有类型unsigned char,则必须以这种方式零扩展8位值:

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