2013-10-14 4 views
0
 
[terminal]$ ./yis a.yo 
Stopped in 11 steps at PC = 0x2c. Status 'HLT', CC Z=1 S=0 O=0 
Changes to registers: 
%eax: 0x00000000 0x00000004 
%ebx: 0x00000000 0x00000005 
%esp: 0x00000000 0x00000023 
%ebp: 0x00000000 0x0000002f 

Changes to memory: 
0x0020: 0x2c803fa0 0x27803fa0 
0x0024: 0x20000000 0x05000000 
0x0028: 0x905fb054 0x04000000 
0x002c: 0x45205fa0 0x37000000 
0x0030: 0x32200120 0x0d000000 
0x0034: 0x00905fb0 0x00000000 
[terminal]$ cat a.yo 
    0x000:    |  .pos 0 
    0x000:    | init: 
    0x000: 30f437000000 |  irmovl Stack, %esp 
    0x006: 2045   |  rrmovl %esp, %ebp 
    0x008: 800e000000 |  call Main 
    0x00d: 00   |  halt 
         | 
    0x00e:    | Main: 
    0x00e: a05f   |  pushl %ebp 
    0x010: 2045   |  rrmovl %esp,%ebp 
         | 
    0x012: 30f004000000 |  irmovl $4,%eax 
    0x018: a00f   |  pushl %eax 
    0x01a: 30f305000000 |  irmovl $5,%ebx 
    0x020: a03f   |  pushl %ebx 
    0x022: 802c000000 |  call Sum 
         | 
    0x027: 2054   |  rrmovl %ebp,%esp 
    0x029: b05f   |  popl %ebp 
    0x02b: 90   |  ret 
         | 
    0x02c:    | Sum: 
    0x02c: a05f   |  pushl %ebp  #right here 
    0x02e: 2045   |  rrmovl %esp,%ebp 
         | 
    0x030: 2001   |  rrmovl %eax,%ecx 
    0x032: 2032   |  rrmovl %ebx,%edx 
         | 
    0x034: b05f   |  popl %ebp 
    0x036: 90   |  ret 
    0x037:    | Stack: 

Я использую the yas simulator для компиляции и запуска сборки y86. Я пытаюсь понять, почему программа останавливается на 0x2c. Она ничего не делает, кроме отправки 2 констант в функцию (которая даже не используется), которая просто перемещает значения, которые будут параметрами в другие регистры.Простая y86 do-nothing program halt

ответ

0

Вы переписываете части кода с содержимым стека.

Вы инициализируете esp до Stack, то есть 0x37. Когда вы достигнете Sum, у вас будет 5 DWORDs на стеке (3 * pushl и 2 * call). Пять DWORDs - 20 байт (0x14), а 0x37 - 0x14 - 0x23 (помните, что стек растет в памяти назад). Вы можете видеть, что это список «Изменения в регистрах»: %esp: 0x00000000 0x00000023.

Как вы можете видеть в списке «Изменения в памяти», DWORD на 0x2C (где начинается Sum), изменился с 0x45205fa0 на 0x37000000. Предполагая малоконечный, это означает, что байт по адресу 0x2C равен 0x00, что равно HALT.

+0

Итак, как я могу исправить эту проблему? Должен ли я изменить файл .yo? Или мои инструкции в файле the.ys неверны (часть, которая показана справа от '' 'шестнадцатеричных команд), которую я скомпилировал для получения этого .yo-файла? – SGM1

+0

Я не знаком с симулятором Y86 и как выглядит его карта памяти, но я бы предложил либо продвинуть стек дальше вперед (инициализировать 'esp' до чего-то вроде 0x200), либо сохранить стек там, где он есть, и перенести его код впереди. – Michael

+0

Чтобы убедиться, измените 'irmovl Stack,% esp' на' irmovl $ 512,% esp'? – SGM1