“无形参函数”利用汇编代码传递变量地址 [有点意思]

说明:

8位的: AH,AL,BH,BL,CH,CL,DH,DL
16位的: AX,BX,CX,DX,BP,SP,DI,SI等

32位的: EAX,EBX,ECX,EDX,ESP,ESP

相关32位汇编指令寄存器的标识符号
(常用)
【ebp:基址指针寄存器 】
【ebx:通用寄存器 】
【edi:目的索引地址寄存器】



(1)基与VC6编译器的汇编格式的相关代码

 

#include<iostream> #include<algorithm> using namespace std; void sort() { int *array; _asm { push eax; /*保存现场*/ mov eax,[ebp]; /*将ebp基址指针寄存器中的内容-当前的基地址保存在通用寄存器eax中*/ sub eax,36; /*array数组大小是36个字节,当前地址减去36记得到数组的首地址*/ mov [array],eax; /*用计算出来的首地址给array赋值,即是得到的数组的首地址*/ pop eax; /*回复现场,恢复eax通用寄存器之前的值*/ } sort(array, array + 9); //调用STL的排序函数 } int main(int argc, char *argv[] ) { int array[] = { 45, 56, 76, 234, 1, 34, 23, 2, 3 }; sort(); //<- 利用sort给array数组排序,注意sort不带参数的函数。 int i; for (i = 0; i < 9; i++) printf("%d/n", array[i]); return 0; }

 

(2)基与g++编译器的汇编格式的相关代码 [暂时有点小问题,g++的汇编指令不熟悉]

【AT&T汇编不熟悉】

 

#include<iostream> #include<algorithm> using namespace std; void sort() { int* array = 0; __asm__(" pushl %eax /n" " movl (%ebp), %eax /n" " subl $36, %eax /n" "??????????????????" " popl %eax /n" ); // __asm__ ( // "cld /n/t" // "rep /n/t" // "stosl" // "movl (%ebp), %eax /n/t" // "subl $36, %eax /n/t" // : "=a" (array) // : // ); sort(array, array + 9); return; } int main(int argc, char *argv[] ) { int array[] = { 45, 56, 76, 234, 1, 34, 23, 2, 3 }; sort(); int i; for (i = 0; i < 9; i++) printf("%d/n", array[i]); return 0; }

 

你可能感兴趣的:(汇编,编译器)