2

下面发布的是我为一个简单的 y86 汇编程序编写的代码。给定两个整数,它应该打印出两者中较大的一个。在每一行的右边,我有一个等效的 C 翻译。

# 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

使用汇编程序yas,生成的 .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 行的指令7514000000。这是告诉程序计数器在应该告诉它转到0x016时转到第0x014行(甚至不存在的行) 。第0x011行也存在同样的问题。为什么会这样?
  • 当我使用地址行而不是标签来组装程序时,会打印结果,但不会打印换行符。我怎样才能解决这个问题?
  • 最后,一个小问题:如果我没有将注释作为第一行,则第一行代码将被忽略。这应该发生吗?

感谢您的宝贵时间,我期待您提供任何答案。

4

2 回答 2

3

YAS 需要在最后一行之后换行以构建正确的 yo 代码。有关详细信息,请参阅http://y86tutoring.wordpress.com/2012/11/06/yas-no-halt-for-the-wicked/

于 2012-11-06T21:56:07.760 回答
2

您将停止语句放在 wrch 之前,因此在写入换行符之前执行停止,看起来 yas 完全忽略了它。这可能会解释您的其他问题,例如将跳转移动一个字节;程序中的行数可能大于实际汇编的行数,这可能会使汇编程序在进行地址跳转时感到困惑。

于 2012-04-11T01:44:03.727 回答