Выражение, ожидаемое ранее, и слишком мало аргументов, связывающих C и 32-битный ASM

# #c #assembly #x86

#c #собрание #x86

Вопрос:

Привет всем, я работаю в своем классе сборки, и мы дошли до последней части и связываем программы на C с 32-разрядной сборкой на базе Intel. Я далеко не идеальный программист, и это моя самая первая программа на языке Си. Это не будет здорово, у меня нет опыта. У меня проблемы с двумя вызовами функций, я прикреплю изображение выдаваемых кодов ошибок, где вы можете увидеть точную синтаксическую ошибку и сделать все возможное, чтобы получить код здесь. Спасибо, любой свет, который вы можете пролить, будет полезен.

  • Ошибка 1:

    слишком мало аргументов функция addstr строка 27

  • Ошибка 2:

    выражение, ожидаемое перед фактом, фактом и добавлением : строки 26, 36, 37

  • Ошибка 3:

    неиспользуемая переменная int b : строка 36 Изображение ошибки: может быть немного размытым, перенесено из linux в Windows

Это мой код:

 //This is the C Program #include lt;stdio.hgt; #define StrLen 10 void addstr(char *a, char *b);  int is_palindrome(char *s);  int factstr(char *s);  void palindrome_check();  int fact(int n); int main() {  int a;  char Str1[StrLen];  char Str2[StrLen];  char Str3[StrLen];  char Str4[StrLen];  do  { printf("1. adding two numbers togethern"); printf("2. test if string is palindromen"); printf("3. print factorial of a numbern"); printf("4. test if string is palindrome pt2n"); printf("Enter a number or type 0 to terminaten"); scanf("%d", amp;a); if (a == 1){ printf("Please enter a string seperated by a spacen"); fgets(Str1, StrLen, stdin); fgets(Str2, StrLen, stdin); char answer = addstr(char *Str1, char *Str2); printf("%d", answer); }else if(a == 2){ printf("Please enter a string for checking"); fgets(Str3, StrLen, stdin); printf("%s", Str3); }else if(a == 3){ printf("Please enter a string to find the factorial of"); fgets(Str4, StrLen, stdin); int b = factstr(char *Str4); fact(int b); }else if (a == 4){ printf("Work in progressn"); }else{ printf("re check inputn"); }  }while(a != 0); return 0; }  int fact(int b){  int i;  unsigned long long fact = 1;  if(b gt;= 0){  for (i = 1; i lt;= b;   i) {  fact *= i;  }  }else{  printf("Cannot find factorial, try a different number");  }  printf("Factorial of %d = %llu", b, fact); }  
 //This is the Assembly Program BITS 32 EXTERN atoi EXTERN addstrNum global addstr global palindrome_check global factstr section .data userMsg: DW 'Please enter a String to check:', lenUserMsg EQU $-userMsg usereMsg DB 'Is a Palindrome', 0xa lenUsereMSG EQU $-usereMsg usrMsg DB 'Is not a Palindrome', 0xa lenUsrMsg EQU $-usrMsg  Section .bss s:RESB 1024 w:RESB 1024  section .text _start: palindrome_check: ;promping the user to enter a string in which to check for palindrome Loop_Palindrome:  push ebp  mov ebp, esp  pusha  mov eax, 4  mov ebx, 1  mov ecx, userMsg  mov edx, lenUserMsg int 80h  mov eax, 3  mov ebx, 0  mov ecx, w  mov edx, s int 80h mov eax, [w] popa pop ebp ret  factstr: push ebp mov ebp, esp mov eax, [ebp   8] call atoi pop ebp ret  addstr: push ebp mov ebp, esp push ebx push esi mov esi, [ebp   8] push esi call atoi mov ebx, eax pop esi xor esi, esi xor eax, eax mov esi, [ebp   12] push esi call atoi add ebx, eax pop esi mov eax, ebx pop esi pop ebx pop ebp ret  

Комментарии:

1. Вы не должны указывать тип аргумента при вызове функции. например int b = factstr(char *Str4); , просто должно быть int b = factstr(Str4);

2. спасибо, шут, это исправило несколько моих проблем. Теперь я собираюсь уточнить «контроль достигает конца функции, не являющейся пустой». Ценю это.

3. Ваша fact функция не имеет return в этом значения.

4. вот и все. Спасибо тебе, парень.

5. Примечание сбоку: никогда не используйте BITS 32 . Это позволяет вам случайно собрать 32-разрядный машинный код в файл .o и исполняемый файл, который будет декодировать его в 64-разрядном режиме, вместо того, чтобы получать ошибки во время сборки, если вы случайно это сделаете nasm -felf64 . (Больше проблем с GAS, чем с NASM, так as как / gcc не нужны параметры командной строки для сборки в 64-разрядном режиме.)