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

代码是:

#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]+20coda的起始位置偏移20,因此经过coda->c(20个项目)到达coda->n


那应该可以帮助您理解第一个。相同的想法可以扩展到第二个。

关于c - 无法理解这种从C到Assembly的转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3124730/

10-09 19:11