GCC NASM 混合编程, 这一次大概有点实用性了, 是借用程序堆栈实现了数制ascii转换,当然负数的部分没写,留个思考额余地吧
;testnasm.asm
global _bin2ascii, _mystack
extern _s
[BITS 32]
section .data
_tab: db '0123456789abcdef', 0
section .text
_bin2ascii: ; char bin2ascii(int i);
push ebp
mov ebp, esp
push ebx
mov ebx, _tab
mov eax, [3 * 4 + esp]
xlat
pop ebx
pop ebp
ret
_mystack: ; int mystack(int i);
push ebp
mov ebp, esp
push ebx
push ecx
push edx
xor ecx, ecx
mov eax, [5 * 4 + esp]
mov ebx, 16
.1:
or eax, eax
jz .2
xor edx, edx
div ebx
push edx
inc ecx
jmp .1
.2:
mov eax, ecx
mov ebx, _s
.3:
pop dword[ebx]
add ebx, 4
loop .3
pop edx
pop ecx
pop ebx
pop ebp
ret
// testc_nasm.c
#include <stdio.h>
char bin2ascii(int i);
int mystack(int i);
int s[0xff];
void mybin2ascii(char* str, int i) {
int l, j;
if(i < 0) {
i = -i;
}
if(i == 0){
s[0] = '0';
s[1] = '\0';
return;
} else {
l = mystack(i);
for(j = 0; j < l; j++) {
str[j] = bin2ascii(s[j]);
}
str[j] = '\0';
}
}
int main(void) {
int i = 65535, l;
char str[0xff];
mybin2ascii(str, i);
printf("%d = 0x%s\n", i, str);
i = 65537;
mybin2ascii(str, i);
printf("%d = 0x%s\n", i, str);
}