2012-04-11 5 views
2

, представленный ниже, - это код, который я использую для простой программы сборки y86. Учитывая два целых числа, он должен распечатать большую из двух. Справа от каждой строки у меня есть эквивалентный перевод C.y86 монтажные этикетки не делают то, что они должны быть

# I ask about the need for a first line comment below. 
rdint %eax   # scanf("%d", &a); 
rdint %ebx   # scanf("%d", &b); 
rrmovl %eax, %ecx # c = a; 
subl %ebx, %ecx # c = a - b; 
jge  ALarger  # if (c >= 0) { goto ALarger }; 
wrint %ebx   # printf("%d", b); 
jmp  End   # goto End; 

ALarger: 
wrint %eax   # printf("%d", a); 

End: 
irmovl $10, %ecx  # c = 10; 
halt 
wrch %ecx 

Используя ассемблер Яс, полученный .yo файл выглядит следующим образом:

0x000: f118   | # I ask about the need for a first line comment below. 
0x002: f208   | rdint %eax   # scanf("%d", &a); 
0x004: f238   | rdint %ebx   # scanf("%d", &b); 
0x006: 2001   | rrmovl %eax, %ecx # c = a; 
0x008: 6131   | subl %ebx, %ecx # c = a - b; 
0x00a: 7514000000 | jge  ALarger  # if (c >= 0) { goto ALarger }; 
0x00f: f338   | wrint %ebx   # printf("%d", b); 
0x011: 7016000000 | jmp  End   # goto End; 
        | 
0x016:    | ALarger: 
0x016: f308   | wrint %eax   # printf("%d", a); 
        | 
0x018:    | End: 
0x018: 30810a000000 | irmovl $10, %ecx  # c = 10; 
0x01e: 10   | halt 
  • Это не была собрана правильно. Мне сказали, что везде, где встречается ярлык, он заменяется адресом того, где он находится в программе. Если введенное первое число больше, инструкция по строке 0x00a - . Это говорит счетчику программы перейти к строке 0x014 (строка, которая даже не существует), когда она должна сказать, чтобы она перешла к 0x016. Та же проблема существует для строки 0x011. Почему это происходит?
  • Когда я собираю программу, используя адресные строки вместо меток, результат печатается, однако новая строка не является. Как я могу это исправить?
  • Наконец, второстепенный вопрос: если у меня не было комментария в качестве первой строки, первая строка кода игнорируется. Это должно произойти?

Благодарим за внимание, я с нетерпением жду любых ответов, которые вы можете предоставить.

+0

Я ничего не знаю об этом, но, оглядываясь по сети, кажется, что другие примеры, которые я могу найти, имеют отступ с сборкой, с метками слева от той же строки, например http: //csapp.cs .cmu.edu/public/simguide.pdf - это может объяснить неправильные адреса ярлыков и, если бы это была действительно дрянная реализация, может даже объяснить необходимость в исходном комментарии ... другими словами, дикая догадка заключается в том, что ваш формат ввода неправильный, и парсер yas запутан. –

+0

Что произойдет, если вы поместите метку в ту же строку, что и инструкция: «ALARGER: wrint% eax» в той же строке и т. Д. –

+0

Когда я делаю это, строка для ALARGER: wrint% eax по-прежнему 0x016 и End: irmovl $ 10,% ecx по-прежнему 0x018. Команды jge и jmp также остаются неизменными. Кажется, это стилистическая вещь. Спасибо в любом случае @andrew. –

ответ

2

Вы помещаете инструкцию halt перед wrch, поэтому выполнение останавливается перед написанием новой строки, и похоже, что yas просто полностью игнорирует ее. Это может объяснить ваши другие проблемы, такие как переходы, сдвинутые на один байт; возможно, что количество строк в программе больше, чем те, которые фактически собраны, путают ассемблер, когда он идет, чтобы поместить в адресные переходы.

+0

Конечно, я попробовал, и если вы переключите эти две последние строки, все будет хорошо. – scry

+0

Ваша логика звучит, и это имеет смысл. Я не удивлен, что это сработало для вас, так оно и должно быть. Я изначально написал этот код так, как вы его предлагали, но когда он собран, файл .yo переходит в haywire. Конечная строка «halt» не создается, каждый адрес увеличивается на единицу, а при запуске программа останавливается на 1 шаг. Он запускается в Exception 'HLT', ака, останавливается. Я обнаружил, что не помещать новую строку после завершения этой проблемы для меня. У меня такое чувство, что это может быть проблемой вне моего контроля и скоро свяжутся с моим профессором. Благодарю за ваш ответ. –

+0

Скрученный вокруг, и вы были правы! Трюк сразу же нажал кнопку «Ввод». Должна быть пустая строка после остановки? y86 странно. –

Смежные вопросы