将asm嵌入C编程

将asm嵌入C编程,c,assembly,C,Assembly,我正在努力学习我自己,我已经阅读了不同的网站,首先知道一些寄存器的含义,如果,等等,并看到了如何使用它们的例子 然而,我觉得这不容易理解。该程序查找某些字母,并使用二维数组在电路板中对其进行计数。我想用汇编代码替换函数void print\u results()和void count()的一部分,因为这在常规C代码中非常容易 我不知道如何开始,所以我更感兴趣的只是一个好的开始,特别是如何将变量从voidread_board()传递到函数void count()来计算找到的字母,之后我想我可以自己

我正在努力学习我自己,我已经阅读了不同的网站,首先知道一些寄存器的含义,如果,等等,并看到了如何使用它们的例子

然而,我觉得这不容易理解。该程序查找某些字母,并使用二维数组在电路板中对其进行计数。我想用汇编代码替换函数
void print\u 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;
}
#包括
文件*inputFilePtr;
炭板[7][7];
无效用法(){
printf(“用法:一个文件名参数。\n”);
}
无效读板(){
int i,j;
对于(i=0;i!=7;i++){
对于(j=0;j!=7;j++){
fscanf(inputFilePtr、%c、&board[i][j]);
}
fscanf(inputFilePtr,“\n”);
}
}
无效计数(){
__阿斯姆\
");
}
作废打印结果(){
}
int main(int argc,字符**argv){
如果(argc!=2){
用法();
返回1;
}
inputFilePtr=fopen(argv[1],“r”);
如果(inputFilePtr==NULL){
printf(“无法打开文件%s\n”,argv[1]);
返回1;
}
读板();
计数();
打印结果();
返回0;
}

如果我没弄错,你可以要求打电话。也许这会有帮助:

如果我没弄错,你可以要求打电话给我。也许这会有所帮助:

我假设您需要与当前asm部件相同的C语言版本

因为您的阵列板是全局的,并且板大小是固定的(7x7),所以您不需要传递任何内容来计数()。这将有助于:

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&j与您的情况不同,它们不是全局的): 呼叫计数为:
count(&board[0][0],int i,int j)


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

我假设您想要做当前asm部件的C等效物

因为您的阵列板是全局的,并且板大小是固定的(7x7),所以您不需要传递任何内容来计数()。这将有助于:

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&j与您的情况不同,它们不是全局的): 呼叫计数为:
count(&board[0][0],int i,int j)

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

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

天然气,x86

  • ,此页有一个非常容易阅读的说明。点击顶部的链接可以得到整个“书”

  • 海湾合作委员会;有一个带有一些C代码asm列表的示例部分

  • ,有一些关于intel vs AT&T语法的信息。(就像上面的维基书籍一样)。另外,请查看带有>5个参数的系统调用。站点上的参数稍有下降

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

天然气,x86

  • ,此页有一个非常容易阅读的说明。点击顶部的链接可以得到整个“书”

  • 海湾合作委员会;有一个带有一些C代码asm列表的示例部分

  • ,有一些关于intel vs AT&T语法的信息。(就像上面的维基书籍一样)。另外,请查看带有>5个参数的系统调用。站点上的参数稍有下降


汇编不像C一样是标准的东西。它在很大程度上取决于您使用的处理器。您需要查看处理器/编译器的精确调用约定,以了解如何准确地混合使用C和asm。例如,用于传递参数的寄存器可能会有所不同。您使用的编译器是什么?我使用的是linux fedora,我使用的是GCC。GCC的内联asm语法如中所述。汇编与C不同,它不是标准的东西。它在很大程度上取决于您使用的处理器。您需要查看处理器/编译器的精确调用约定,以了解如何准确地混合使用C和asm。例如,用于传递参数的寄存器可能会有所不同。您使用的编译器是什么?我使用的是linux fedora,我使用的是GCC。中介绍了GCC的内联asm语法。好的,非常感谢Thiruvaluvar先生的帮助。好的,非常感谢Thiruvaluvar先生的帮助。