女人被狂躁到高潮视频免费无遮挡,内射人妻骚骚骚,免费人成小说在线观看网站,九九影院午夜理论片少妇,免费av永久免费网址

當(dāng)前位置:首頁 > 工業(yè)控制 > 電子設(shè)計自動化
[導(dǎo)讀]gcc采用的是AT&T的匯編格式,MS采用Intel的匯編格式. 一 基本語法 語法上主要有以下幾個不同. 1、寄存器命名原則 AT&T: %eax Intel: eax 2、源/目的操作數(shù)順序 AT&T: movl %eax,%ebx Intel: mov ebx,eax 3、常數(shù)/立即

gcc采用的是AT&T的匯編格式,MS采用Intel的匯編格式.

一 基本語法

語法上主要有以下幾個不同.

1、寄存器命名原則

AT&T: %eax

Intel: eax

2、源/目的操作數(shù)順序

AT&T: movl %eax,%ebx

Intel: mov ebx,eax

3、常數(shù)/立即數(shù)的格式

AT&T: movl $_value,%ebx

Intel: mov eax,_value

把_value的地址放入eax寄存器

AT&T: movl $0xd00d,%ebx

Intel: mov ebx,0xd00d

4、操作數(shù)長度標(biāo)識

AT&T: movw %ax,%bx

Intel: mov bx,ax

5、尋址方式

AT&T: immed32(basepointer,indexpointer,indexscale)

Intel: [basepointer + indexpointer*indexscale + imm32)

Linux工作于保護(hù)模式下,用的是32位線性地址,所以在計算地址時不用考慮segmentffset的問題.上式中的地址應(yīng)為:

imm32 + basepointer + indexpointer*indexscale

下面是一些例子:

1、直接尋址

AT&T: _booga ; _booga是一個全局的C變量

注意加上$是表示地址引用,不加是表示值引用.

注:對于局部變量,可以通過堆棧指針引用.

Intel: [_booga]

2、寄存器間接尋址

AT&T: (%eax)

Intel: [eax]

3、變址尋址

AT&T: _variable(%eax)

Intel: [eax + _variable]

AT&T: _array(,%eax,4)

Intel: [eax*4 + _array]

AT&T: _array(%ebx,%eax,8)

Intel: [ebx + eax*8 + _array]

二 基本的行內(nèi)匯編

基本的行內(nèi)匯編很簡單,一般是按照下面的格式

asm("statements");

例如:

asm("nop");

asm("cli");

asm 和 __asm__是完全一樣的.

如果有多行匯編,則每一行都要加上 "nt"

例如:

asm( "pushl %eaxnt"

"movl $0,%eaxnt"

"popl %eax");

實際上gcc在處理匯編時,是要把a(bǔ)sm(...)的內(nèi)容"打印"到匯編文件中,所以格式控制字符是必要的.

再例如:

asm("movl %eax,%ebx");

asm("xorl %ebx,%edx");

asm("movl $0,_booga);

在上面的例子中,由于我們在行內(nèi)匯編中改變了edx和ebx的值,但是由于gcc的特殊的處理方法,即先形成匯編文件,再交給GAS去匯編,所以GAS并不知道我們已經(jīng)改變了edx和ebx的值,如果程序的上下文需要edx或ebx作暫存,這樣就會引起嚴(yán)重的后果.對于變量_booga也存在一樣的問題.為了解決這個問題,就要用到擴(kuò)展的行內(nèi)匯編語法.

三 擴(kuò)展的行內(nèi)匯編

擴(kuò)展的行內(nèi)匯編類似于Watcom.

基本的格式是:

asm ( "statements" : output_regs : input_regs : clobbered_regs);

clobbered_regs指的是被改變的寄存器.

下面是一個例子(為方便起見,我使用全局變量):

int count=1;

int value=1;

int buf[10];

void main()

{

asm(

"cld nt"

"rep nt"

"stosl":: "c" (count), "a" (value) , "D" (buf[0]): "%ecx","%edi" );

}

得到的主要匯編代碼為:

movl count,%ecx

movl value,%eax

movl buf,%edi

#APP

cld

rep

stosl

#NO_APP

cld,rep,stos就不用多解釋了.這幾條語句的功能是向buf中寫上count個value值.冒號后的語句指明輸入,輸出和被改變的寄存器.通過冒號以后的語句,編譯器就知道你的指令需要和改變哪些寄存器,從而可以優(yōu)化寄存器的分配.其中符號"c"(count)指示要把count的值放入ecx寄存器

類似的還有:

a eax

b ebx

c ecx

d edx

S esi

D edi

I 常數(shù)值,(0 - 31)

q,r 動態(tài)分配的寄存器

g eax,ebx,ecx,edx或內(nèi)存變量

A 把eax和edx合成一個64位的寄存器(use long longs)

我們也可以讓gcc自己選擇合適的寄存器.如下面的例子:

asm("leal (%1,%1,4),%0"

: "=r" (x)

: "0" (x) );

這段代碼實現(xiàn)5*x的快速乘法.

得到的主要匯編代碼為:

movl x,%eax

#APP

leal (%eax,%eax,4),%eax

#NO_APP

movl %eax,x

幾點說明:

1.使用q指示編譯器從eax,ebx,ecx,edx分配寄存器.使用r指示編譯器從eax,ebx,ecx,edx,esi,edi分配寄存器.

2.我們不必把編譯器分配的寄存器放入改變的寄存器列表,因為寄存器已經(jīng)記住了它們.

3."="是標(biāo)示輸出寄存器,必須這樣用.

4.數(shù)字%n的用法:數(shù)字表示的寄存器是按照出現(xiàn)和從左到右的順序映射到用"r"或"q"請求的寄存器.如果我們要重用"r"或"q"請求的寄存器的話,就可以使用它們.

5.如果強(qiáng)制使用固定的寄存器的話,如不用%1,而用ebx,則

asm("leal (%%ebx,%%ebx,4),%0"

: "=r" (x)

: "0" (x) );

注意要使用兩個%,因為一個%的語法已經(jīng)被%n用掉了.

下面可以來解釋letter 4854-4855的問題:

1、變量加下劃線和雙下劃線有什么特殊含義嗎?加下劃線是指全局變量,但我的gcc中加不加都無所謂.

2、以上定義用如下調(diào)用時展開會是什么意思?

#define _syscall1(type,name,type1,arg1)

type name(type1 arg1)

{

long __res;

/* __res應(yīng)該是一個全局變量 */

__asm__ volatile ("int $0x80"

/* volatile 的意思是不允許優(yōu)化,使編譯器嚴(yán)格按照你的匯編代碼匯編*/

: "=a" (__res)

/* 產(chǎn)生代碼 movl %eax, __res */

: "0" (__NR_##name),"b" ((long)(arg1)));

/* 如果我沒記錯的話,這里##指的是兩次宏展開.

即用實際的系統(tǒng)調(diào)用名字代替"name",然后再把__NR_...展開.

接著把展開的常數(shù)放入eax,把a(bǔ)rg1放入ebx */

if (__res >= 0)

return (type) __res;

errno = -__res;

return -1;

}



來源:ks990次

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護(hù)是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機(jī)驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機(jī)驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉