我正在努力学习汇编我的自我,我一直在阅读不同的网站,以了解一些寄存器的含义,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;
}
答案 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?
X86 Assembly/GAS Syntax,这个页面有一个非常容易阅读的指令。点击顶部的X86_Assembly链接即可获得整个“book”。
Writing Assembly-Language Functions ...海湾合作委员会;有 示例 部分,其中包含一些C代码&lt; - &gt; asm列出。
Using Assembly Language in Linux (http://asm.sourceforge.net),有关于intel与AT&amp; T语法的一些信息。 (正如上面的维基书)。另请查看 Syscalls with&gt;网站上的5个args。 。