c - 这段代码用什么来确定数组的大小?

标签 c x86 structure

typedef struct {   
    char array[B];    
    int t;            
    short s[B];       
    int u;            
} str2;

typedef struct {
   short x[A][B];  
   int y;          
} str1;         

void setVal{str1* p, str2 *q) {
   int v1 = q->t;                
   int v2 = q->u;
   p->y = v1+v2;
}
movl 12(%ebp), %eax
movl 40(%eax), %edx
addl 12(%eax), %edx
movl 8(%ebp), %eax
movl %edx, 96(%eax)

我无法理解 IA32 代码。我明白第一个 movl 指令表示 %eax = q,第四个 movl 指令表示 %eax = p,但我不明白第二个、第三个和第五个指令是什么意思。我认为第二条指令意味着 q + B(char 1byte) = q + 40。对吗?

最佳答案

第二条和第三条指令对eax的值进行操作,其中包含q的值。

第二条指令获取q指向的内存位置加上40字节的值。添加位移是因为引用的struct成员的偏移量是40字节。

第三条指令添加另一个成员,基本上计算表达式 v1+v2。同样,eax(包含 q 的值)指向 str2 并且位移 12 是偏移到引用成员的 struct

第四条指令用p加载eax,第五条指令加载计算表达式v1+v2,到p 加上96字节,即p->y,点。

关于c - 这段代码用什么来确定数组的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41109975/

相关文章:

linux - 内核如何设置注册cr3?

c - 将文件中的整数数组存储在结构 C 中

c - 如何使用指针和动态内存将结构传递到函数中进行打印 [C 编程]

c - 为什么 printf with\n 会产生段错误?

c++ - 如何找到当前硬件线程的L3缓存索引和NUMA节点索引

c - 如何将多个参数传递给线程函数

assembly - 为什么 mov eax,val 不是 mov $val,%eax 的英特尔语法等效项?

java - 尝试填充单链表

c - fprintf,错误 : format not a string literal and no format arguments [-Werror=format-security

c - 调用 accept() 后是否选择了虚拟主机根目录?