将asm嵌入到C编程中

时间:2012-03-29 18:42:43

标签: c assembly

我正在努力学习汇编我的自我,我一直在阅读不同的网站,以了解一些寄存器的含义,if-the等,并看到了如何使用它们的示例。

但是我觉得不容易理解。该程序找到某些字母并使用二维数组在板中计数它们。我想用汇编代码替换函数void print_results()void count()的一部分,因为这在常规C代码中非常容易。

我不知道如何开始所以我对一个好的开始更感兴趣,特别是如何将变量从void read_board()传递给函数void count()来计算发现的字母后我认为我可以靠自己。

感谢您的帮助,谢谢。

#include <stdio.h>

FILE *inputFilePtr;
char board[7][7];

void usage() {
    printf("usage: one filename argument.\n");
}

void read_board() {
    int i, j;
    for (i=0; i != 7; i++) {
        for (j=0; j != 7; j++) {
            fscanf(inputFilePtr, "%c", &board[i][j]);
        }
        fscanf(inputFilePtr, "\n");
    }
}

void count() {

     __asm__("\
      ");

}

void print_results() {

}

int main(int argc, char**argv) {
    if (argc != 2) {
        usage();
        return 1;
    }

    inputFilePtr = fopen(argv[1], "r");
    if (inputFilePtr == NULL) {
        printf("Couldn't open file, %s\n", argv[1]);
        return 1;
    }

    read_board();

    count();

    print_results();

    return 0;
}

3 个答案:

答案 0 :(得分:2)

如果我做对了,你要求调用约定。也许这会有所帮助:http://en.wikipedia.org/wiki/Calling_convention

答案 1 :(得分:1)

我假设您想要与当前的asm部分相同的C等价物。

由于阵列板是全局的并且您的电路板尺寸是固定的(7x7),因此您不需要将任何内容传递给count()。这样做:

void count() {
int i, j, count = 0;
char = 'X'; //Replace with whatever char you want to count 

  for (i=0; i != 7; i++) {
        for (j=0; j != 7; j++) {
          if(board[i][j] == c)
             count++;
       }
   }
}

然后只需从任何地方调用count()。

如果您想知道如何将参数传递给函数(如果电路板,i&amp; j不像您的情况那样是全局的): 通话计数为:count(&board[0][0], int i, int j);

接收参数:void count(char **board, int i, int j)

答案 2 :(得分:1)

不是asm中的直接(源)解决方案,但这里有一些您可能或可能没有读过的链接:

GAS,x86?