Встраивание asm в C-программирование - PullRequest
0 голосов
/ 29 марта 2012

Я пытаюсь изучать сборку самостоятельно, и я сначала читал разные веб-сайты, чтобы узнать значение некоторых регистров, 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 ]

2 голосов
/ 29 марта 2012

Если я правильно понял, вы запрашиваете соглашения о вызовах .Может быть, это поможет: http://en.wikipedia.org/wiki/Calling_convention

1 голос
/ 29 марта 2012

Не является прямым (исходным) решением в asm, но вот некоторые ссылки, которые вы могли или не могли прочитать:

ГАЗ, x86?

1 голос
/ 29 марта 2012

Я предполагаю, что вы хотите C-эквивалент, который выполняет вашу текущую часть asm.

Поскольку доска массивов является глобальной, а размер платы фиксирован (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 & j не являются глобальными, как ваш случай): количество вызовов как: count(&board[0][0], int i, int j);

Получите параметры как: void count(char **board, int i, int j)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...