说明:
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; }