将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代码中非常容易
我不知道如何开始,所以我更感兴趣的只是一个好的开始,特别是如何将变量从voidread_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先生的帮助。