Существует классическая проблема с программой: отсутствие новой строки в файле 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 вводит вас в заблуждение, потому что, что критически важно, он не вызывает исключений при перезаписи кода данными.