現在已經是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...