下面发布的是我为一个简单的 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行也存在同样的问题。为什么会这样?
- 当我使用地址行而不是标签来组装程序时,会打印结果,但不会打印换行符。我怎样才能解决这个问题?
- 最后,一个小问题:如果我没有将注释作为第一行,则第一行代码将被忽略。这应该发生吗?
感谢您的宝贵时间,我期待您提供任何答案。