一步步编写操作系统 78 intel汇编与ATT汇编语法区别
本節咱們介紹下intel匯編語法和at&t匯編語法的區別。
?
?
以上表中未列出這兩種語法在內存尋址方面的差異,個人覺得區別還是很大的,下面單獨說說。
在Intel語法中,立即數就是普通的數字,如果讓立即數成為內存地址,需要將它用中括號括起來,“[立即數]”這樣才表示以“立即數”為地址的內存。
而AT&T認為,內存地址既然是數字,那數字也應該被當作內存地址,所以,數字被優先認為是內存地址,也就是說,操作數若為數字,則統統按以該數字為地址的內存來訪問。這樣,立即數的地位比較次要了,如果想表示成單純的立即數,需要額外在前面加個前綴$。
無論是哪種匯編語言風格,都要有訪問內存的能力,這就是內存尋址。
咱們之前學習了Intel匯編語法中的很多尋址方式,就內存尋址來說,有直接尋址,基址尋址,變址尋址,基址變址尋址。也可能是習慣了的原因,我個人覺得intel語法真的很直白,容易理解,尤其是在和AT&T的內存尋址相比較之后……
而在AT&T中的內存尋址還是挺獨特的,它的內存尋址有固定的格式:
segreg(段基址):base_address(offset_address,index,size)
該格式對應的表達式為:
segreg(段基址):base_address+ offset_address+ index*size。
此表達式的格式和intel 32位內存尋址中的基址變址尋址類似,intel的格式:
segreg:[base+index*size+offset]
不過與intel不同的是,AT&T地址表達式的值是內存地址,直接被當做是內存來讀寫,而不是普通數字。
看上去格式有些怪異,但其實這是一種“通用”格式,格式中短短的幾個成員囊括了它所有內存尋址的方式,任意一種內存尋址方式,其格式都是這個通用格式的子集,都是格式中各種成員的組合。下面介紹下這些成員項。
base_address是基地址,可以為整數,變量名,可正可負。
offset_address是偏移地址,index是索引值,這兩個必須是那8個通用寄存器之一。
size是個長度,只能是1、2、4、8(intel語法中也是只能乘以這4個數)。
下面看看內存尋址中有哪些方式,注意,這些方式都是上面通用格式的一部分。
直接尋址:此尋址中只有base_address項,即后面括號中的東東全不要,base_address便為內存啦,比如movl $255,0xc00008F0,或者用變量名:mov $6,var。
寄存器間接尋址:此尋址中只有offset_address項,即格式為(offset_address),要記得,offset_address只能是通用寄存器。寄存器中是地址,不要忘記格式中的圓括號。如mov (%eax), %ebx。
寄存器相對尋址:此尋址中有offset_address項和base_address項,即格式為base_address(offset_address)。這樣得出的內存地址是基址+偏移地址之和。
各部分還是要按照格式填寫,如movb -4(%ebx),%al,功能是將地址(ebx-4)所指向的內存復制1字節到寄存器al。
變址尋址:此類尋址稱為變址的原因是含有通用格式中的變量Index。因為index是size的倍數,所以有index的地方就有size。既然是變址,只要有index和size就成了,base_address和offset_address可有可無,注意,格式中沒有的部分也要保留逗號來占位。一共有4種變址尋址組合,下面各舉個例子。
無base_address,無offset_address:
movl %eax,(,%esi,2)
功能是將eax的值寫入esi*2所指向的內存。
無base_address,有offset_address:
movl %eax,(%ebx, %esi,2)
功能是將eax的值寫入ebx+esi*2所指向的內存。
有base_address,無offset_address:
movl %eax,base_value(,%esi,2)
功能是將eax的值寫入base_value+esi*2所指向的內存。
有base_address,有offset_address:
movl %eax,base_value(%ebx,%esi,2)
功能是將eax的值寫入base_value+ebx+ esi*2所指向的內存。
好啦,AT&T就簡單介紹到這,咱們重點是內聯匯編。
總結
以上是生活随笔為你收集整理的一步步编写操作系统 78 intel汇编与ATT汇编语法区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 便宜近千元!苹果国内首次上架iPad A
- 下一篇: 一步步编写操作系统 48 加载内核1