我想知道是否有人可以向我解释这个问题的解决方案:
代码是:
#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单元中包含的值
谢谢
最佳答案
我想那...D[0]+3
是对coda
地址的引用(函数调用中的*coda
)D[D[0]+3]
是在存储coda
的地址处的数据查找D[D[0]+3]+20
与coda
的起始位置偏移20,因此经过coda->c
(20个项目)到达coda->n
。
那应该可以帮助您理解第一个。相同的想法可以扩展到第二个。
关于c - 无法理解这种从C到Assembly的转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3124730/