我的目標是要做到以下幾點:獲取字符串的長度在NASM與strlen的通話
1)編寫調用由C
2的strlen計算字符串長度的NASM代碼)調用此在C函數打印提供的字符串的長度
NASM代碼:
;nasm -f elf32 getLength.asm -o getLength.o
segment .text
extern strlen
global getLength
getLength:
push ebp ;save the old base pointer value
mov ebp,esp ;base pointer <- stack pointer
mov eax,[ebp+8] ;first argument
call strlen ; call our function to calculate the length of the string
mov edx, eax ; our function leaves the result in EAX
pop ebp
ret
的C代碼:
#include <stdio.h>
#include <string.h>
int getLength(char *str);
int main(void)
{
char str[256];
int l;
printf("Enter string: ");
scanf("%s" , str) ;
//l = strlen(str);
l = getLength(str);
printf("The length is: %d\n", l);
return 0;
}
我嘗試編譯,鏈接和運行如下:
1)NASM -f ELF32 getLength.asm -o getLength.o
2)GCC -c length.c -o的getLength。 ø-m32
3)的gcc getLength.o getLength.o -o長度-m32
錯誤我得到:
getLength.o: In function `getLength':
getLength.asm:(.text+0x0): multiple definition of `getLength'
getLength.o:getLength.asm:(.text+0x0): first defined here
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib32/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: error: ld returned 1 exit status
是的。這是編譯技巧!然而,在我的NASM代碼中似乎有某種錯誤,因爲我得到了0的結果。 – SpiderRico
完美!非常感謝。 – SpiderRico