仍然是汇编和C混合编程的例子,这次用了gcc 和 NASM
之所以选择gcc和NASM,主要目的是在开发操作系统的时候,经常要用到几种不同的汇编和C语言的编译器,而NASM和GCC都是开源的,而且也配合的非常好,同时又是INTEL格式的汇编,相信会很合大家的胃口。
global __strlen, _str, _print
extern _ss, _printf
_str: db 'Good Luck!', 0 ;_str: db "Good Luck!", 0
_print: ; void print(char* s);
push ebp
mov ebp, esp
mov ebx, [2 * 4 + esp]
push ebx
call __strlen
add esp, 1 * 4
push eax
push dword [_ss]
push ebx
call _printf ; printf("%s len = %d", ss, _strlen(ss));
add esp, 3 * 4
pop ebp
ret
__strlen: ; int _strlen(char* s);
push ebp
mov ebp, esp
push ebx
push edi
xor eax, eax
mov ebx, [4 * 4 + esp]
mov edi, ebx
repne scasb
sub edi, ebx
dec edi
mov eax, edi
pop edi
pop ebx
pop ebp
ret
#include <stdio.h>
int _strlen(char* s); //之所以是_strlen(),是因为标准库中有同名函数
extern char str;
char* ss = "%s ### len = %d";
void print(char* s);
int main(void) {
printf("%d\n", _strlen("1234567890"));
printf("%d\n", _strlen(&str));
print(ss);
}