Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在Y86汇编中,如何为多个阵列很好地分配空间?_C_Assembly_Y86 - Fatal编程技术网

C 在Y86汇编中,如何为多个阵列很好地分配空间?

C 在Y86汇编中,如何为多个阵列很好地分配空间?,c,assembly,y86,C,Assembly,Y86,我正在尝试将C代码转换为Y86汇编代码 如果有多个数组声明,例如: int a[100], b[100]; 假设每个整数是4个字节。您如何知道pos.指令在内存中指向何处,从而不会浪费任何空间 <Assembly code begins here> ... halt # Array initialization begins here .pos ? A: .long 0 .pos ? B: .long 0 ... 停止 #数组初始化从这里开始 pos先生? A:

我正在尝试将C代码转换为Y86汇编代码

如果有多个数组声明,例如:

int a[100], b[100];
假设每个整数是4个字节。您如何知道pos.指令在内存中指向何处,从而不会浪费任何空间

<Assembly code begins here>

...

halt

# Array initialization begins here
.pos ?
A:
.long 0

.pos ?   
B:
.long 0

...
停止
#数组初始化从这里开始
pos先生?
A:
.long 0
pos先生?
B:
.long 0

让汇编程序担心偏移量。
一种可能是定义一个包含局部变量的结构

struc Locals
    a dd ? dup 100
    b dd ? dup 100
ends Locals

sub esp, sizeof Locals ;; or perhaps sizeof struc Locals
mov ebp, esp           ;; take a copy of stack ptr

mov eax, [ebp + offset a] ;;  
mov ebx, [ebp + offset b] ;;  
在gcc中,“struct”的含义是修改当前段的绝对位置,而不引入可链接代码:

.file "temp.c"
    .struct 0
a:  .struct a + 4*100
b:  .struct b + 4*100
c:               ;; c will contain expression for the size
    .struct 0    ;; you can start a new struct here
a2: .struct a2 + 4   ;; this struct would be  'int a2;'
b2: .struct b2 + 8   ;;  'double b2'
c2:                  ;; sizeof struct #2

.text  
    sub c, %rsp
    mov $13, a(%rsp)   ;; a[0] = 13
    mov $2,  b(%rsp)   ;; b[0] = 2

使用堆栈。不是固定的内存位置。所有这些都是简单的算术嗯,好吧,这是否意味着我只需要跟踪每个数组开头的内存位置?假设我知道我的两个数组的起始位置是0和400,我是否必须将所有内容都视为堆栈指针的位移?另外:假设我有10个数组。我是否需要跟踪每个数组的起始内存位置,作为堆栈指针的位移?还是有更好的方法?因为它不会与所有置换值的硬编码混淆吗?编译器会在它们上保留一个内部选项卡。如果你是自己写的,你需要退后一步,先仔细阅读这些东西。如果你能给我一个直截了当的回答,我将不胜感激。如果你只是自己写,那么你必须自己记录位移。但是编译器有自己的方法来跟踪位移。对吗?