无法理解从C到Assembly的转换

时间:2010-06-26 17:07:01

标签: c assembly

我想知道是否有人可以解释这个问题的解决方案:

代码是:

#include <stdio.h> 
#include <stdlib.h> 
typedef struct { 
    int c[20]; 
    int n; 
} t_coda; 
t_coda coda; 
void init(t_coda *coda) { 
    coda->n = 0; 
} 
void add(t_coda *coda, int x) { 
    if (coda->n < 20) 
        coda->c[(coda->n)++] = x; 
} 
main() { 
    init(&coda); 
    coda->n=1; 
    coda->c[0]=2; 
    add(&coda,3); 
    add(&coda,4); 
} 

我需要在simplesem(类似汇编的语义)中知道相应的:coda->n = 0;coda->c[(coda->n)++] = x;的指令;

解决方案是:

set D[D[0]+3]+20, 0 

第一个问题 和

set D[D[0]+3]+D[D[D[0]+3]+20], D[D[0]+4]
set D[D[0]+3]+20, D[D[D[0]+3]+20] + 1

为第二个;

D是数据堆栈,D [0]返回数据的0单元格中包含的值

谢谢

1 个答案:

答案 0 :(得分:1)

我猜是......

  • D[0]+3coda地址的引用(函数调用中的*coda
  • D[D[0]+3]是查找存储coda的地址的数据
  • D[D[0]+3]+20coda开始的偏移量为20,因此超过coda->c(即20个项目)以转到coda->n

这应该有助于你理解第一个;同样的想法可以扩展到第二个。