2013-02-26 2 views
2

IA32 к Y86Как преобразовать инструкцию IA32 'cmp' в Y86?

ATT Ассамблея

У меня есть следующий код IA32 сборки:

Bubble: 
.LFB0: 
    pushl %esi 
    pushl %ebx 
    movl 16(%esp), %esi 
    movl 12(%esp), %edx 
    subl $1, %esi 
    andl %esi, %esi 
    jle .L1 
.L7: 
    xorl %eax, %eax 
.L5: 
    movl 4(%edx,%eax,4), %ecx 
    movl (%edx,%eax,4), %ebx 
    cmpl %ebx, %ecx 
    jge .L4 
    movl %ebx, 4(%edx,%eax,4) 
    movl %ecx, (%edx,%eax,4) 
.L4: 
    addl $1, %eax 
    cmpl %eax, %esi 
    jg .L5 
    subl $1, %esi 
    jne .L7 
.L1: 
    popl %ebx 
    popl %esi 
    ret 

Я пытаюсь преобразовать его в Y86 код сборки. У меня возникли проблемы с переводом инструкции сравнения:

cmpl %ebx, %ecx 

Спасибо.

ответ

9

Кажется, что Y86 не имеет инструкции cmp. Однако он имеет sub, push и pop.

cmpl %ebx, %ecx Так может быть преобразован в следующий код:

pushl %ecx 
subl %ebx, %ecx 
popl %ecx 

cmp точно так же, как и sub, с той разницей, что cmp не сохраняет результат, он обновляет только флаги. Таким образом, cmp всегда может быть заменен на push, sub, pop (если в стеке достаточно места).

+0

Имеет смысл, спасибо! – amorimluc