史萊姆論壇

史萊姆論壇 (http://forum.slime.com.tw/)
-   程式語言討論區 (http://forum.slime.com.tw/f76.html)
-   -   C++與組合語言 入門教學(混例) (http://forum.slime.com.tw/thread166688.html)

mini 2006-01-24 03:38 PM

C++與組合語言 入門教學(混例)
 
首先來看個最簡單的例子
PHP 語法:

#include<stdio.h>
#include<conio.h>

int xy;

int main(void){
    
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=0x13y;

    
__asm{
       
mov axx
       mov y
ax
    
}
    
printf("%d"y);

    
getch();
    return 
0;


可以發現 DEV-C++ 顯然 把 mov 指令的 目的與來源 顛倒了
而 VC++ 則是正常
(mov ax,13 ; ax是目的 ,13是來源)
這不知是不是 DEV-C++ 的 bug :drtyt76h6


再來再舉一個兩變數交換實例
PHP 語法:

#include <cstdlib>
#include <iostream>

using namespace std;

long xy;

void swap(int xint y){
    
__asm
    
(
   
//放進堆疊空間
     
"push _x \n"
     "push _y \n"
   
//從堆疊空間取出
     
"pop  _x \n"
     "pop  _y"
    
);
}

int main(int argcchar *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(xy);
    
printf("交換後\nX: %d\nY: %d\n\n",x,y);
    
    
cout << "(2)布林運算(不需第三地暫存變數)交換實例" << endl;
    
xx^y;
    
yx^y;
    
xx^y;
    
printf("交換後\nX:%d\nY:%d\n\n",x,y);
    
    
system("PAUSE");
    return 
EXIT_SUCCESS;


裡面包含了兩種交換方法
理論很單純希望大家會喜歡
(至於 VC++之寫法就請看官自行改寫看看了)


所有時間均為台北時間。現在的時間是 02:43 PM

Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2025, Jelsoft Enterprises Ltd.

『服務條款』

* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *


SEO by vBSEO 3.6.1