对这个 Y86 汇编代码的内存位置感到困惑

标签 c assembly y86

我们在一节课上有一段 C 代码,我们需要将它转换为 Y86,这是由一些人写在黑板上的,当然还有老师的更正。

但是,我混淆了代码初始部分的内存位置和 .pos 指令:

int array[100], sum, i;

int main() {
    sum = 0;

    for(i = 0; i < 100; i++) {
        array[i] = i;
        sum += array[i];
    }
}

.pos 0
    irmovl Stack, %esp
    rrmovl %esp, %ebp
    jmp main
array:
.pos 430

sum: .long 0
i: .long 0

main:
  // (rest of the code that doesn't really matter here)

我从这段代码中了解到的是:
它从位置 0 (.pos 0) 开始,irmovl 指令占用 6 个字节,因此,下一条 rrmovl 指令从位置 6 开始,并且该指令占用 2 个字节,我们现在位于位置 8。

jmp 指令占用 5 个字节,从 8 开始,我们现在在位置 13。

现在节省堆栈空间来保存 array 的 100 个整数是很容易的,为此我们使用 .pos 430 来保存至少 400 个字节(4 字节 * 100 个整数)和另外 17 个字节(下一个位置减去当前位置,430-13=17)。

我们现在位于位置 430,我们需要再保存 4 个字节来保存 sum 和另外 4 个字节来保存 i,它位于位置 438。

我们程序的主要代码将从位置 438 开始。

我想我做对了,我唯一的问题很简单:
为什么我们使用 .pos 430 来保存 100 个整数的空间?我们只需要恰好 400 个字节来容纳所有这些。 .pos 413(因为之前的位置是 13,我们需要 400 个字节来存储 100 个整数,因此是 413)是否足够并且比 .pos 430 更正确?

我错过了什么?

最佳答案

我认为 pos 不会增加职位。这是一个将代码放在那里的指令。

所以“array”从位置 13 开始,“sum”从 430 开始。这使得 main 从 438 开始,数组只剩下 417。

为以后进行更改留一点空间总是一个好主意。如果您稍后想要增加数组或添加另一条指令,则必须在整个代码中调整 pos 指令。如果访问数组出现错误,它还可以避免 sum 被破坏。填充到 430 更具防御性。

关于对这个 Y86 汇编代码的内存位置感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1019716/

相关文章:

c - ZMQ 中发布者的订阅者元数据信息

函数返回值后可以使用free()吗?

c++ - FSCANF 阅读撇号和连字符时遇到问题?

c - 使用 C/Intel 汇编,测试 128 字节内存块是否包含全零的最快方法是什么?

debugging - (gdb) 获取寄存器指示的内存地址的值

c - 汇编优化函数调用,允许从函数中取出常量吗?

compilation - "can' t find label"Y86 编译器中的错误

c - 值不是数组、指针或 vector

assembly - 如何在引导模式下关闭具有 Assembly 16 位的 PC?

c - 未知 IA32 汇编语言指令