2013-11-19 4 views
1

У меня есть этот IA32 ассемблерный код, который я пытаюсь преобразовать в Y86 код сборки:Как конвертировать инструкции от IA32 к Y86

bubble_a: 
    pushl %ebp 
    movl %esp, %ebp 
    pushl %edi 
    pushl %esi 
    pushl %ebx 
    movl 8(%ebp), %edx 
    movl 12(%ebp), %edi 
    subl $1, %edi 
    testl %edi, %edi 
    jg .L11 
    jmp .L8 
.L9: 
    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 %edi, %eax 
    jne .L9 
.L7: 
    subl $1, %edi 
    je .L8 
.L11: 
    movl $0, %eax 
    testl %edi, %edi 
    jg .L9 
    jmp .L7 
.L8: 
    popl %ebx 
    popl %esi 
    popl %edi 
    popl %ebp 
    ret 

Я изо всех сил, чтобы перевести инструкции MOVL в .L9

movl 4(%edx,%eax,4), %ecx 
movl (%edx,%eax,4), %ebx 
movl %ebx, 4(%edx,%eax,4) 
movl %ecx, (%edx,%eax,4) 

Я знаю, что нет никакой инструкции, которая сделает это, но я не могу понять, какой набор инструкций заменит их в Y86.

Благодарим за помощь.

+1

Наверняка это не то, что намеревался ваш учитель. Выбросьте этот код и напишите свой с нуля. –

+0

Знаете ли вы, что означают инструкции x86, и задаетесь вопросом, есть ли подобная инструкция; или вам просто нужна помощь в разборе инструкций x86? Я не знаю вашего набора инструкций, но у вас наверняка будут команды add и mul type, которые могут реплицировать то, что x86 делает за один шаг. – gnometorule

ответ

1

Как вы уже знаете, Y86 не имеет гибких и сложных схем адресации. Поэтому ваша работа заключается в использовании нескольких инструкций для имитации расчета, выполненного в инструкциях x86. Более того, понимание смысла кода сборки уменьшит вашу работу.
Давайте посмотрим четыре строки кода, который вы выделили

movl 4(%edx,%eax,4), %ecx 
movl (%edx,%eax,4), %ebx 
movl %ebx, 4(%edx,%eax,4) 
movl %ecx, (%edx,%eax,4) 

Основная работа она делает это, чтобы поменять два номера, сохраненные по адресу R[%edx]+R[%eax]*4 и R[%edx]+R[%eax]*4+4. Чтобы рассчитать эти адреса, мы должны добавить их сами. Вот так, что он может быть переведен в Y86:

rrmovl %eax, %esi 
addl %esi, %esi 
addl %esi, %esi 
addl %edx, %esi 
mrmovl 4(%esi), %ecx 
mrmovl (%esi), %ebx 
rmmovl %ebx, 4(%esi) 
rmmovl %ecx, (%esi) 

Первые четыре строки вычислить значение R[%edx]+R[%eax]*4 (первый двойной в два раза, а затем плюс), которые хранятся в %esi, и следующий довольно просто.