64位組合語言簡介

2021-07-03 14:43:37 字數 3020 閱讀 5303

現在已經是64位的時代了,x86-64(amd64)平台將是下一代計算機的體系結構,我們開發作業系統的當然要對x86-64的彙編有所了解。

1.x86-64的暫存器

x86-64較x86-32多了8個通用暫存器,而且,每個通用暫存器都是64位寬,它們是:

rax,rbx,rcx,rdx,rsi,rdi,rsp,rbp

r8,r9,r10,r11,r12,r13,r14,r15

同時,x86-64全面支援x86-32和x86-16的通用暫存器:

eax,ax,al,ah,

ebx,bx,bl,bh,

....

而且,還對傳統的edi,esi做了改進:

edi ,32位

di,16位

dil ,8位,在傳統的x86機器中,di是不可按照8位來訪問的,但在x86-64下可以。

同樣esi也可以按照8位來訪問。乙個很特別的暫存器 rip,相當於x86-32的eip. 在x86-32是不可直接訪問的,如mov eax,eip是錯的,但在x86-64位下卻可以,如 mov,rax,qword ptr [rip+100]是對的。而且,它除了是個程式計數器外,也是個「資料基位址」,有此可見,它現在是身兼兩職!為什麼在x86-64位下要用rip做訪問資料的基位址呢?因為,在x86-64下,ds,es,cs,ss都沒有實際意義了,也就是說,它們不再參與位址計算,只是為了相容x86-32。fs,gs還是參與位址計算,它們兩個和x86-32的意義相同。

2.x86-64的彙編

x86-64的彙編和x86-32的沒有多大的區別。新增了新暫存器和指令。

寫64位彙編**時,可以用8、16、32、64位暫存器,如:

push   rdi

sub   rsp, 48               ;

mov   r10, rcx

; line 36

mov   rdi, rdx

xor   eax, eax

mov   ecx, 512            

rep stosb

; line 43

movsxd   r8, dword ptr [r10+16]

mov   qword ptr [rsp+32], rdx

mov   r9, qword ptr [r10+648]

mov   rdx, qword ptr [r10+52]

mov   rcx, qword ptr [r10+44]

call   fs_read_disk

; line 47

mov   ecx, 1

cmp   eax, ecx

cmovne   ecx, eax

mov   eax, ecx

; line 52

add   rsp, 48              

pop   rdi

ret   0

再如:$l1818:

; line 2398

mov   al, byte ptr [rdx+rbx]

cmp   al, 32              

jne   short $l1819

mov   byte ptr [rdx+rbx], 0

$l1819:

add   r8d, 1

movsxd   rdx, r8d

xor   eax, eax

mov   rcx, r12

mov   rdi, rbx

repne scasb

not   rcx

sub   rcx, 1

cmp   rdx, rcx

jb   short $l1818

但,有點值得注意,當操作傳統的32位暫存器時,那麼,整個64位暫存器都會受到影響,如:

mov eax,0ah

那麼,rax也等於000000000000000ah

再如:mov rcx,0aaaaaaaaaaaaaaaah

(此時ecx等於0aaaaaaaah)

mov ecx,0ddddddddh

(此時,rcx等於00000000ddddddddh,高32位受到了影響).

規則:example 1: 64-bit add:

before:rax =0002_0001_8000_2201

rbx =0002_0002_0123_3301

add rbx,rax ;48 is a rex prefix for size.

result:rbx = 0004_0003_8123_5502

example 2: 32-bit add:

before:rax = 0002_0001_8000_2201

rbx = 0002_0002_0123_3301

add ebx,eax ;32-bit add

result:rbx = 0000_0000_8123_5502

(32-bit result is zero extended)

example 3: 16-bit add:

before:rax = 0002_0001_8000_2201

rbx = 0002_0002_0123_3301

add bx,ax ;66 is 16-bit size override

result:rbx = 0002_0002_0123_5502

(bits 63:16 are preserved)

example 4: 8-bit add:

before:rax = 0002_0001_8000_2201

rbx = 0002_0002_0123_3301

add bl,al ;8-bit add

result:rbx = 0002_0002_0123_3302

(bits 63:08 are preserved)

3.總結

當然,這裡說的都是最基本的東西,是針對通用暫存器言的。其實,x86-64對fpu(數學處理單元)和mmx,sse,sse2都做了很大的改進。然而,對寫os來說,我們最關心的還是通用暫存器

組合語言(五) 64位程式設計

amd 和 intel 64 位處理器的出現增加了對 64 位程式設計的興趣。masm 支援 64 位 所有的 visual studio 2012 版本 最終版 高階版和專業版 以及桌面系統的 visual studio 2012 express 都會同步安裝 64 位版本的彙編器。與32 位版本...

彙編(一)組合語言簡介

本系列將簡單介紹組合語言的基礎知識,目的是為編譯原理課程打下基礎,因此涉及的內容相對淺顯,不作過高要求。本篇將對組合語言進行簡單介紹,分析組合語言的特點並熟悉計算機的軟硬體系統及暫存器組。組合語言vs高階程式語言 1 組合語言的通用性 可移植性較差。高階語言可以在多種計算機上編譯後執行。2 組合語言...

組合語言Assemble標誌位

zf 零標誌位 1結果為0 0結果為1 pf奇偶標誌位 1結果二進位制表示中有偶數個1 0結果二進位制表示中有奇數個1 sf符號標誌位 1結果為負 最高位為1 0結果為正 最高位為0 cf進製標誌位 1產生進製或者借位 0不產生進製或者借位 of溢位標誌位 1發生溢位 0不發生溢位 of overf...