一步步编写操作系统 78 intel汇编与ATT汇编语法区别
本節(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 便宜近千元!苹果国内首次上架iPad A
- 下一篇: iPhone真要用USB-C了:美国欲出