青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

asm, c, c++ are my all
-- Core In Computer
posts - 139,  comments - 123,  trackbacks - 0

[轉(zhuǎn)]AT&T x86 asm 語法

創(chuàng)建時(shí)間:2001-04-09
文章屬性:翻譯

DJGPP 使用AT&T格式的匯編語法。和一般的intel格式的語法有點(diǎn)不同。主要不同點(diǎn)如下:

AT&T 語法顛倒了源和目的操作數(shù)的位置, 目的操作數(shù)在源操作數(shù)之后。寄存器操作數(shù)要有個(gè)%的前綴,? 立即數(shù)操作數(shù)要有個(gè)$符號(hào)的前綴。存

儲(chǔ)器操作數(shù)的大小取決于操作碼的最后一個(gè)字符。 它們是b (8-bit), w (16-bit), 和 l (32-bit).
這里有一些例子。 左邊部分是intel指令格式,右邊是at&t格式。
??? movw %bx, %ax??????? // mov ax, bx
??? xorl %eax, %eax??????? // xor eax, eax
??? movw $1, %ax??????? // mov ax,1
??? movb X, %ah??????? // mov ah, byte ptr X
??? movw X, %ax??????? // mov ax, word ptr X
??? movl X, %eax??????? // mov eax, X
大部分操作指令,at%t和intel都是差不多的,除了這些:
??? movsSD???????????? // movsx
??? movzSD???????????? // movz

S和D分辨代表源和目的操作數(shù)后綴。
??? movswl %ax, %ecx??? // movsx ecx, ax
??? cbtw??????????????? // cbw
??? cwtl??????????????? // cwde
??? cwtd??????????????? // cwd
??? cltd??????????????? // cdq
??? lcall $S,$O???????? // call far S:O
??? ljmp $S,$O????????? // jump far S:O
??? lret $V???????????? // ret far V
操作嘛前綴不能與他們作用的指令寫在同一行。 例如, rep 和stosd應(yīng)該是兩個(gè)相互獨(dú)立的指令, 存儲(chǔ)器的情況也有一點(diǎn)不同。通常intel格

式的如下:

section:[base + index*scale + disp]

被寫成:

section:disp(base, index, scale)

這里有些例子:

??? movl 4(%ebp), %eax??????????????? // mov eax, [ebp+4])
??? addl (%eax,%eax,4), %ecx????????? // add ecx, [eax + eax*4])
??? movb $4, %fs:(%eax)?????????????? // mov fs:eax, 4)
??? movl _array(,%eax,4), %eax??????? // mov eax, [4*eax + array])
??? movw _array(%ebx,%eax,4), %cx??? // mov cx, [ebx + 4*eax + array])

Jump 指令通常是個(gè)短跳轉(zhuǎn)。 可是, 下面這些指令都是只能在一個(gè)字節(jié)的范圍內(nèi)跳轉(zhuǎn): jcxz, jecxz, loop, loopz, loope, loopnz 和loopne

。象在線文檔所說的那樣,一個(gè)jcxz foo可以擴(kuò)展成以下工作:
??? jcxz cx_zero
??? jmp cx_nonzero
cx_zero:
??? jmp foo
cx_nonzero:
文檔也注意到了mul和imul指令。 擴(kuò)展的乘法指令只用一個(gè)操作數(shù),例如, imul $ebx, $ebx將不會(huì)把結(jié)果放入edx:eax。使用imul %ebx中的

單操作數(shù)來獲得擴(kuò)展結(jié)果。


--------------------------------------------------------------------------------

Inline Asm
我將首先開始inline asm, 因?yàn)樗坪蹶P(guān)于這方面的疑問非常多。這是最基本的語法了, 就象在線幫助信息中描述的:
__asm__(asm statements : outputs : inputs : registers-modified);

這四個(gè)字段的含義是:

asm statements - AT&T 的結(jié)構(gòu), 每新行都是分開的。
outputs - 修飾符一定要用引號(hào)引起來, 用逗號(hào)分隔
inputs - 修飾符一定要用引號(hào)引起來, 用逗號(hào)分隔
registers-modified - 名字用逗號(hào)分隔
一個(gè)小小的例子:
??? __asm__("
??????? pushl %eax\n
??????? movl $1, %eax\n
??????? popl %eax"
??? );
假如你不用到特別的輸入輸出變量或者修改任何寄存器的值,一般來說是不會(huì)使用到其他的三個(gè)字段的,
讓我們來分析一下輸入變量。

??? int i = 0;

??? __asm__("
??????? pushl %%eax\n
??????? movl %0, %%eax\n
??????? addl $1, %%eax\n
??????? movl %%eax, %0\n
??????? popl %%eax"
??? :
??? : "g" (i)
??? );??? // increment i
不要為上面的代碼所困擾! 我將盡力來解釋它。我們想讓輸入變量i加1,我們沒有任何輸出變量, 也沒有改變寄存器值(我們保存了eax值)。

因此,第二個(gè)和最后一個(gè)字段是空的。 因?yàn)橹付溯斎胱侄? 我們?nèi)孕枰A粢粋€(gè)空的輸出字段, 但是沒有最后一個(gè)字段, 因?yàn)樗鼪]被使用

。在兩個(gè)空冒號(hào)之間留下一個(gè)新行或者至少一個(gè)空格。

下面讓我們來看看輸入字段。 附加描述符可以修正指令來讓你給定的編譯器來正確處理這些變量。他們一般被附上雙引號(hào)。那么這個(gè)"g"是用

來做什么的呢?? 只要是合法的匯編指令,"g"就讓編譯器決定該在哪里加載i的值。一般來說,你的大部分輸入變量都可以被賦予 "g", 讓編

譯器決定如何去加載它們 (gcc甚至可以優(yōu)化它們!)。 其他描述符使用"r" (加載到任何可用的寄存器去), "a" (ax/eax), "b" (bx/ebx),

"c" (cx/ecx), "d" (dx/edx), "D" (di/edi), "S" (si/esi), 等等。

我們將要提到一個(gè)在asm代碼里面的如%0的輸入變量。如果我們有兩個(gè)輸入, 他們會(huì)一個(gè)是%0一個(gè)是%1, 在輸入段里按順序排列 (如下一個(gè)例

子)。假如N個(gè)輸入變量且沒有輸出變量, 從%0 到%N-1將和輸入字段里的變量相對(duì)應(yīng), 按順序排列。

如果任何的輸入, 輸出, 寄存器修改字段被使用, 匯編代碼里的寄存器名必須用兩個(gè)%來代替一個(gè)%。對(duì)應(yīng)于第一個(gè)沒有使用最后三個(gè)字段的例

子。

讓我們看看兩個(gè)輸入變量且引入了"volatile"的例子:

??? int i=0, j=1;
??? __asm__ __volatile__("
??????? pushl %%eax\n
??????? movl %0, %%eax\n
??????? addl %1, %%eax\n
??????? movl %%eax, %0\n
??????? popl %%eax"
??? :
??? : "g" (i), "g" (j)
??? );??? // increment i by j
Okay, 現(xiàn)在我們已經(jīng)有了兩個(gè)輸入變量了。沒問題了, 我們只需要記住%0對(duì)應(yīng)第一個(gè)輸入變量(在這個(gè)例子中是i), %1對(duì)應(yīng)在i后面的列出的j


Oh yeah, 這個(gè)volatile到底是什么意思呢? 它防止你的編譯器修改你的匯編代碼,就是不進(jìn)行優(yōu)化(紀(jì)錄, 刪除, 結(jié)合,等等優(yōu)化手段。), 不

改變代碼原樣來匯編它們。建議一般情況下使用volatile選項(xiàng)。

讓我們來看看輸出字段:

??? int i=0;
??? __asm__ __volatile__("
??????? pushl %%eax\n
??????? movl $1, %%eax\n
??????? movl %%eax, %0\n
??????? popl %%eax"
??? : "=g" (i)
??? );??? // assign 1 to i
這看起來非常象我們前面提到的輸入字段的例子; 確實(shí)也沒有很大的不同。所有的輸出修飾符前面都應(yīng)該加上=字符,他們同樣在匯編代碼里

面用%0到%N-1來表示, 在輸出字段按順序排列。你一定會(huì)問如果同時(shí)有輸入和輸出字段會(huì)怎么排序的呢? 好,下面一個(gè)例子就是讓大家知道

如何同時(shí)處理輸入輸出字段的。
??? int i=0, j=1, k=0;
??? __asm__ __volatile__("
??????? pushl %%eax\n
??????? movl %1, %%eax\n
??????? addl %2, %%eax\n
??????? movl %%eax, %0\n
??????? popl %%eax"
??? : "=g" (k)
??? : "g" (i), "g" (j)
??? );??? // k = i + j
Okay, 唯一個(gè)不清楚的地方就是匯編代碼中的變量的個(gè)數(shù)。我馬上來解釋一下。
當(dāng)同時(shí)使用輸入字段和輸出字段的時(shí)候:

%0 ... %K 是輸出變量

%K+1 ... %N 是輸入變量

在我們的例子中, %0 對(duì)應(yīng)k, %1 對(duì)應(yīng)i, %2對(duì)應(yīng)j。很簡(jiǎn)單,是吧?

到現(xiàn)在為止我們都沒有使用最后一個(gè)字段(registers-modified)。如果我們要在我們的匯編代碼里使用任何寄存器, 我們要明確的用push和

pop指令來保存它們, 或者列到最后一個(gè)字段里面讓gcc來處理它們。

這是前面的一個(gè)例子, 沒有明確的保留和存貯eax。

??? int i=0, j=1, k=0;
??? __asm__ __volatile__("
??????? pushl %%eax\n??? /*譯者注:好像原文說的有點(diǎn)問題,明明是保存了eax的值,:(*/
??????? movl %1, %%eax\n
??????? addl %2, %%eax\n
??????? movl %%eax, %0\n
??????? popl %%eax"
??? : "=g" (k)
??? : "g" (i), "g" (j)
??? : "ax", "memory"
??? );??? // k = i + j
我們讓gcc來保存和存貯eax, 如果必要的話。一個(gè)16-bit寄存器名代表了32-, 16-或8-bit寄存器。 如果我們要改寫內(nèi)存 (寫入一個(gè)變量等。

), 建議在register-modified字段里面來指定"memroy"修飾符。這意味著除了第一個(gè)例子我們都應(yīng)該加上這個(gè)修飾符, 但是直到現(xiàn)在我才提出

來, 是為了更簡(jiǎn)單易懂。

在你的內(nèi)聯(lián)匯編里面定位標(biāo)號(hào)應(yīng)該使用b或f來作為終止符, 尤其是向后向前的跳轉(zhuǎn)。(譯者注:b代表向后跳轉(zhuǎn),f代表向前跳轉(zhuǎn))

For example,

??? __asm__ __volatile__("
??????? 0:\n
??????????? ...
??????????? jmp 0b\n
??????????? ...
??????????? jmp 1f\n
??????????? ...
??????? 1:\n
??????????? ...
??? );
這里有個(gè)用c代碼和內(nèi)聯(lián)匯編代碼混合寫的跳轉(zhuǎn)程序的例子(thanks to Srikanth B.R for this tip).

void MyFunction( int x, int y )
{
??? __asm__( "Start:" );
??? __asm__( ...do some comparison... );
??? __asm__( "jl Label_1" );

??? CallFunction( &x, &y );????
??? __asm__("jmp Start");

Label_1:
??? return;
}

--------------------------------------------------------------------------------

External Asm
Blah... Okay fine. Here's a clue: Get some of your C/C++ files, 且用gcc -S file.c來編譯。 然后查看file.S文件。基本結(jié)構(gòu)如下:
??? .file "myasm.S"

??? .data
??? somedata: .word 0
??? ...

??? .text
??? .globl __myasmfunc
??? __myasmfunc:
??? ...
??? ret
Macros, macros! 頭文件libc/asmdefs.h便于你寫asm。 在你的匯編代碼最前面包含此頭文件然后就可以使用宏了。一個(gè)例子: myasm.S:
??? #include <libc/asmdefs.h>

??? .file "myasm.S"

??? .data
??? .align 2
??? somedata: .word? 0
??? ...

??? .text
??? .align 4
??? FUNC(__MyExternalAsmFunc)
??? ENTER
??????????? movl?? ARG1, %eax
??????????? ...
??????????? jmp??? mylabel
??????????? ...
??????? mylabel:
??????????? ...
??? LEAVE
這是一個(gè)好的純粹的匯編代碼框架

posted on 2006-04-23 17:53 Jerry Cat 閱讀(582) 評(píng)論(0)  編輯 收藏 引用

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理



<2006年7月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

常用鏈接

留言簿(7)

隨筆檔案

最新隨筆

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲国产mv| 久久久一本精品99久久精品66| 99国产精品国产精品久久| 亚洲一区二区三区国产| 亚洲国产精品高清久久久| 国产欧美精品日韩区二区麻豆天美| 国模一区二区三区| 亚洲伊人一本大道中文字幕| 亚洲欧洲日本一区二区三区| 国产精品成人va在线观看| 香蕉av福利精品导航| 欧美夜福利tv在线| 欧美日韩亚洲一区二区| 一区二区亚洲欧洲国产日韩| 99国产精品视频免费观看一公开| 一区二区三区欧美日韩| 欧美一区二区三区在线观看视频| 久久久国产午夜精品| 免费看的黄色欧美网站| 亚洲精品美女在线观看| 午夜宅男久久久| 国产精品www网站| 在线观看国产日韩| 亚洲视频在线一区| 欧美二区在线看| 久久综合色综合88| 亚洲欧美日韩在线一区| 欧美精品一区二区三区蜜臀 | 亚洲视频网在线直播| 亚洲永久在线| 亚洲国产精品激情在线观看| 亚洲免费综合| 欧美视频在线观看免费网址| 亚洲国产毛片完整版| 欧美呦呦网站| 亚洲午夜成aⅴ人片| 欧美性生交xxxxx久久久| 91久久久久久久久久久久久| 麻豆国产精品va在线观看不卡| 一区二区三区成人| 欧美日韩在线另类| 久久国产福利国产秒拍| 欧美日本在线播放| 亚洲国产乱码最新视频| 欧美激情91| 欧美日韩视频免费播放| 久久99在线观看| 久久尤物视频| 午夜在线精品偷拍| 欧美成人a∨高清免费观看| 午夜精品久久久久久久男人的天堂 | 亚洲裸体视频| 99国产精品久久久久久久成人热 | 夜夜爽www精品| 亚洲成人资源| 亚洲资源av| 一区二区三区欧美亚洲| 久久激情五月激情| 欧美在线3区| 国产精品成人aaaaa网站| 亚洲电影免费观看高清| 狠狠狠色丁香婷婷综合久久五月| 日韩一级成人av| 亚洲国产一二三| 久久久久久久一区二区三区| 香蕉久久一区二区不卡无毒影院| 欧美高清视频www夜色资源网| 欧美夜福利tv在线| 欧美日韩免费观看一区三区| 女女同性女同一区二区三区91| 国产无一区二区| 日韩视频二区| 欧美大片一区二区| 亚洲黄一区二区三区| 亚洲二区在线| 欧美日本韩国在线| 夜夜嗨av一区二区三区四区| 一区二区三区欧美在线观看| 欧美噜噜久久久xxx| 亚洲久久成人| 一区二区在线视频| 国产视频在线观看一区二区三区| 久久久久欧美| 欧美制服丝袜第一页| 亚洲一区精品视频| 亚洲激情在线激情| 久久婷婷亚洲| 性欧美在线看片a免费观看| 夜夜爽99久久国产综合精品女不卡| 国产女主播一区| 欧美日韩精品久久| 欧美制服第一页| 亚洲免费观看视频| 久久精品人人做人人综合| 在线观看视频一区二区| 国产精品毛片在线看| 免费成人在线视频网站| 午夜视频在线观看一区二区| 欧美一区二区在线免费观看| 亚洲国产成人精品久久| 激情综合电影网| 先锋影音一区二区三区| 亚洲高清激情| 玖玖玖国产精品| 亚洲欧美国产精品桃花| 亚洲经典在线| 国产综合自拍| 国产日韩一级二级三级| 欧美色视频一区| 国产精品久久二区二区| 久久久久天天天天| 午夜欧美大片免费观看| 亚洲图片欧洲图片av| 国产精品99久久不卡二区| 一区二区三区视频免费在线观看| 亚洲国产精品va在线看黑人| 免费成人你懂的| 亚洲国内欧美| 一区二区三区四区五区视频| 亚洲精品国产精品国自产观看浪潮| 亚洲福利视频一区二区| 亚洲精品一区二区在线观看| 亚洲精选国产| 欧美一区二区视频在线观看2020| 欧美一区二区三区在线视频| 欧美亚洲综合久久| 欧美大片免费久久精品三p | 欧美一站二站| 久久国产视频网| 欧美三级不卡| 一区二区三区在线视频免费观看| 在线播放中文字幕一区| 日韩亚洲精品视频| 久久久精品网| 日韩视频一区二区三区| 久久黄色级2电影| 欧美视频一区二区三区| 精品1区2区3区4区| 亚洲午夜电影| 亚洲高清一区二区三区| 欧美中日韩免费视频| 欧美日韩国产成人在线91| 国产综合精品| 在线视频一区观看| 麻豆国产va免费精品高清在线| 一区二区三区欧美激情| 欧美人与性动交cc0o| 亚洲区一区二| 亚洲国内高清视频| 欧美国产日本高清在线| 欧美一区二区三区婷婷月色| 欧美三区在线观看| 亚洲天堂网在线观看| 一区二区成人精品 | 亚洲成人在线视频播放| 久久精品二区三区| 久久视频一区二区| 99国产精品久久久久久久久久| 亚洲第一毛片| 欧美大片在线观看一区二区| 亚洲欧洲精品一区二区三区不卡| 亚洲二区视频| 国产午夜精品久久| 亚洲国产导航| 国产精品户外野外| 欧美成人精品高清在线播放| 久久婷婷国产综合精品青草| 999亚洲国产精| 欧美亚洲日本网站| 亚洲国产清纯| 欧美一区二区三区日韩| 99亚洲一区二区| 一本色道久久综合亚洲精品高清| 国产精品一区二区久久| 欧美多人爱爱视频网站| 欧美午夜精品久久久久免费视| 久久九九免费| 国产精品亚洲аv天堂网| 欧美国产精品劲爆| 国产精品女同互慰在线看| 欧美不卡高清| 国产亚洲午夜高清国产拍精品| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美在线你懂的| 欧美日本在线观看| 亚洲国产精彩中文乱码av在线播放| 欧美日韩在线免费| 亚洲免费高清| 日韩视频中午一区| 欧美精品成人在线| 亚洲国产裸拍裸体视频在线观看乱了中文| 国产精品视频网址| 一本色道久久| 香港久久久电影| 国产人成一区二区三区影院| 在线视频你懂得一区| 亚洲欧美日韩爽爽影院| 国产一区二区三区高清| 久久免费的精品国产v∧| 久久婷婷国产麻豆91天堂|