# #c #assembly #x86
#c #собрание #x86
Вопрос:
Привет всем, я работаю в своем классе сборки, и мы дошли до последней части и связываем программы на C с 32-разрядной сборкой на базе Intel. Я далеко не идеальный программист, и это моя самая первая программа на языке Си. Это не будет здорово, у меня нет опыта. У меня проблемы с двумя вызовами функций, я прикреплю изображение выдаваемых кодов ошибок, где вы можете увидеть точную синтаксическую ошибку и сделать все возможное, чтобы получить код здесь. Спасибо, любой свет, который вы можете пролить, будет полезен.
- Ошибка 1:
слишком мало аргументов функция addstr строка 27
- Ошибка 2:
выражение, ожидаемое перед фактом, фактом и добавлением : строки 26, 36, 37
- Ошибка 3:
Это мой код:
//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-разрядном режиме.)