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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

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

發布時間:2023/12/10 windows 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一步步编写操作系统 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汇编语法区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。