日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

一步步编写操作系统 78 intel汇编与ATT汇编语法区别

發(fā)布時間:2023/12/10 windows 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一步步编写操作系统 78 intel汇编与ATT汇编语法区别 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本節(jié)咱們介紹下intel匯編語法和at&t匯編語法的區(qū)別。

?

?

以上表中未列出這兩種語法在內(nèi)存尋址方面的差異,個人覺得區(qū)別還是很大的,下面單獨說說。

在Intel語法中,立即數(shù)就是普通的數(shù)字,如果讓立即數(shù)成為內(nèi)存地址,需要將它用中括號括起來,“[立即數(shù)]”這樣才表示以“立即數(shù)”為地址的內(nèi)存。

而AT&T認為,內(nèi)存地址既然是數(shù)字,那數(shù)字也應(yīng)該被當(dāng)作內(nèi)存地址,所以,數(shù)字被優(yōu)先認為是內(nèi)存地址,也就是說,操作數(shù)若為數(shù)字,則統(tǒng)統(tǒng)按以該數(shù)字為地址的內(nèi)存來訪問。這樣,立即數(shù)的地位比較次要了,如果想表示成單純的立即數(shù),需要額外在前面加個前綴$。

無論是哪種匯編語言風(fēng)格,都要有訪問內(nèi)存的能力,這就是內(nèi)存尋址。

咱們之前學(xué)習(xí)了Intel匯編語法中的很多尋址方式,就內(nèi)存尋址來說,有直接尋址,基址尋址,變址尋址,基址變址尋址。也可能是習(xí)慣了的原因,我個人覺得intel語法真的很直白,容易理解,尤其是在和AT&T的內(nèi)存尋址相比較之后……

而在AT&T中的內(nèi)存尋址還是挺獨特的,它的內(nèi)存尋址有固定的格式:

segreg(段基址):base_address(offset_address,index,size)

該格式對應(yīng)的表達式為:

segreg(段基址):base_address+ offset_address+ index*size

此表達式的格式和intel 32位內(nèi)存尋址中的基址變址尋址類似,intel的格式:

segreg:[base+index*size+offset]

不過與intel不同的是,AT&T地址表達式的值是內(nèi)存地址,直接被當(dāng)做是內(nèi)存來讀寫,而不是普通數(shù)字。

看上去格式有些怪異,但其實這是一種“通用”格式,格式中短短的幾個成員囊括了它所有內(nèi)存尋址的方式,任意一種內(nèi)存尋址方式,其格式都是這個通用格式的子集,都是格式中各種成員的組合。下面介紹下這些成員項。

base_address是基地址,可以為整數(shù),變量名,可正可負。

offset_address是偏移地址,index是索引值,這兩個必須是那8個通用寄存器之一。

size是個長度,只能是1、2、4、8(intel語法中也是只能乘以這4個數(shù))。

下面看看內(nèi)存尋址中有哪些方式,注意,這些方式都是上面通用格式的一部分。

直接尋址:此尋址中只有base_address項,即后面括號中的東東全不要,base_address便為內(nèi)存啦,比如movl $255,0xc00008F0,或者用變量名:mov $6,var。

寄存器間接尋址:此尋址中只有offset_address項,即格式為(offset_address),要記得,offset_address只能是通用寄存器。寄存器中是地址,不要忘記格式中的圓括號。如mov (%eax), %ebx。

寄存器相對尋址:此尋址中有offset_address項和base_address項,即格式為base_address(offset_address)。這樣得出的內(nèi)存地址是基址+偏移地址之和。

各部分還是要按照格式填寫,如movb -4(%ebx),%al,功能是將地址(ebx-4)所指向的內(nèi)存復(fù)制1字節(jié)到寄存器al。

變址尋址:此類尋址稱為變址的原因是含有通用格式中的變量Index。因為index是size的倍數(shù),所以有index的地方就有size。既然是變址,只要有index和size就成了,base_address和offset_address可有可無,注意,格式中沒有的部分也要保留逗號來占位。一共有4種變址尋址組合,下面各舉個例子。

無base_address,無offset_address:

movl %eax,(,%esi,2)

功能是將eax的值寫入esi*2所指向的內(nèi)存。

無base_address,有offset_address:

movl %eax,(%ebx, %esi,2)

功能是將eax的值寫入ebx+esi*2所指向的內(nèi)存。

有base_address,無offset_address:

movl %eax,base_value(,%esi,2)

功能是將eax的值寫入base_value+esi*2所指向的內(nèi)存。

有base_address,有offset_address:

movl %eax,base_value(%ebx,%esi,2)

功能是將eax的值寫入base_value+ebx+ esi*2所指向的內(nèi)存。

好啦,AT&T就簡單介紹到這,咱們重點是內(nèi)聯(lián)匯編。

總結(jié)

以上是生活随笔為你收集整理的一步步编写操作系统 78 intel汇编与ATT汇编语法区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。