Не получается вывод в первой программе Y86 - PullRequest
1 голос
/ 07 ноября 2011

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

Скомпилированная (?) Программа запрашивает три ввода, но не может их распечататьout.

Код:

Main:   irmovl  Array, %edx
rdint   %eax
rmmovl  %eax, 0(%edx)
rdint   %eax
rmmovl  %eax, 4(%edx)
rdint   %eax
rmmovl  %eax, 8(%edx)

irmovl  $10, %edi
Print:  irmovl  Array, %edx
    mrmovl  0(%edx), %eax
    wrch    %eax
    wrch    %edi
    mrmovl  4(%edx), %eax
    wrch    %eax
    wrch    %edi
    mrmovl  8(%edx), %eax
    wrch    %eax
    wrch    %edi

    halt

    .align 4

Array:
    .long 0
    .long 0
    .long 0

Мой вход:

0
1
2

Выход:

(three blank lines below)



Stopped in 22 steps at PC = 0x47.  Exception 'HLT', CC Z=1 S=0 O=0
Changes to registers:
%edx:   0x00000000      0x0000004c
%edi:   0x00000000      0x0000000a

Changes to memory:
0x0004: 0x024008f2      0x00000001
0x0008: 0x00000000      0x00000002

Changes to memory: 0x0004: 0x024008f2      0x00000001 0x0008:
0x00000000      0x00000002

1 Ответ

0 голосов
/ 08 ноября 2012

Существует классическая проблема с программой: отсутствие новой строки в файле ys, что приводит к неправильной работе YAS.

Первая проблема связана с ошибкой в ​​YAS. Если вы посмотрите в файл yo, созданный YAS, то увидите, что последний оператор .long 0 никогда не будет определен. Вы, вероятно, также увидите, что код операции в первой строке в файле yo равен 0x00, т.е. нет (когда YAS встречает последнюю инструкцию без связанной строки, она оборачивает ее, обворачивая файл yo)

Это означает, что вы теряете первый массив irmovl,% edx (это становится какой-то ерундой, вероятно, 0x00000000, то есть 4 nops), и поэтому вы пишете первый прочитанный символ x'30 '(ascii для' 0 ') к местоположению, указанному edx (которое, вероятно, 0x00000000), находится в первой инструкции (которая была 4 nops - помните, что вы прочитали символ, но он заканчивается в 4-байтовом регистре и сохраняется как таковой). Так вы записываете 0x00000000 в адрес 0x00000000, который в YIS означает, что регистр не был изменен и, следовательно, он не отображается в разделе дампа «Изменения в памяти».

Вы повторяете это со вторым чтением, записывая 0x00000001 во втором слове (перезаписывая инструкцию в этом месте,) и с третьим чтением, записывая 0x00000002 в третьем слове (перезаписывая инструкцию в этом месте.)

Теперь, конечно, вы полностью отыграны! Вы сбрасываете указатель на массив (используя edx,) и пытаетесь напечатать содержимое, но Array (0), Array (4) и Array (8) содержат 0x00000000, потому что это то, что вы определили как (используя ваш. длинные 4 оператора для Array (0) и Array (4) и автоматически для Array (8), поскольку настройка по умолчанию для неопределенной памяти в Y86 равна 0x00000000. И так, программа печатает x'00 '(потому что вы печатаете один символ из 4-байтового слова), что, конечно, является мусором.

Вы заметите, что это соответствует дампу из YIS. eax не показывает, поскольку он не изменился с 0x00000000, его начальное значение. edx и edi выглядят нормально, edi указывает на массив (8). Единственная память, которая изменилась - это второе и третье слово программы (которые были перезаписаны с 0x00000001 и 0x00000002 соответственно)

Итак, в заключение. ЯС делает ошибку. Вы должны преодолеть эту проблему, добавив новую строку после последнего оператора .long 0. YIS вводит вас в заблуждение, потому что, что критически важно, он не вызывает исключений при перезаписи кода данными.

...