首先來看個最簡單的例子
PHP 語法:
#include<stdio.h>
#include<conio.h>
int x, y;
int main(void){
x = 0x13;
__asm("mov _x, %ax");
__asm("mov %ax, _y");
printf("%d", y);
getch();
return 0;
}
__asm("裡面寫組合語言");
%ax 是指暫存器 ax
_y 及 _x 是指讓組合語言巨集指令使用外部c++的變數 x 及 y
而 x、y 需宣告為全域變數
以上是 DEV-C++ 的限制
如果是用 VC++ 就比較開放
PHP 語法:
#include<stdio.h>
#include<conio.h>
int main(void){
int x=0x13, y;
__asm{
mov ax, x
mov y, ax
}
printf("%d", y);
getch();
return 0;
}
可以發現 DEV-C++ 顯然 把 mov 指令的 目的與來源 顛倒了
而 VC++ 則是正常
(mov ax,13 ; ax是目的 ,13是來源)
這不知是不是 DEV-C++ 的 bug
再來再舉一個兩變數交換實例
PHP 語法:
#include <cstdlib>
#include <iostream>
using namespace std;
long x, y;
void swap(int x, int y){
__asm
(
//放進堆疊空間
"push _x \n"
"push _y \n"
//從堆疊空間取出
"pop _x \n"
"pop _y"
);
}
int main(int argc, char *argv[]){
x=13;
y=2147483647;
//y = 0x7FFFFFFF = (0xFFFFFFFF)/2,如果大於 0xF0000000 等於負值
cout << "X/Y 變數使用了 記憶體空間: " << sizeof(x) << " Byte\n\n";
cout << "(1)組合語言之堆疊(使用堆疊記憶體)交換實例" << endl;
printf("交換前\nX: %d\nY: %d\n",x,y);
swap(x, y);
printf("交換後\nX: %d\nY: %d\n\n",x,y);
cout << "(2)布林運算(不需第三地暫存變數)交換實例" << endl;
x= x^y;
y= x^y;
x= x^y;
printf("交換後\nX:%d\nY:%d\n\n",x,y);
system("PAUSE");
return EXIT_SUCCESS;
}
裡面包含了兩種交換方法
理論很單純希望大家會喜歡
(至於 VC++之寫法就請看官自行改寫看看了)