bits 64
global start
extern messageboxa
section .text
start:
push rbp
push rax
push rbx
push rcx
push rdx
push rsi
push rdi
push r8
push r9
push r10
push r11
push r12
push r13
push r14
push r15
jmp real_call
message: db 'hello',0
caption: db 'msg',0
real_call:
xor rcx,rcx
mov rdx,message
mov r8,caption
xor r9d,r9d
sub rsp,28h
call messageboxa
add rsp,28h
pop r15
pop r14
pop r13
pop r12
pop r11
pop r10
pop r9
pop r8
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
pop rbp
ret
movaps xmmword ptr [rsp+150h],xmm8
提示:access violation - code c0000005
檢視棧rsp 並沒有出問題
再檢視一下 movaps 指令:
在網上查到這條指令說明:
從源運算元(第二個運算元)將包含四個壓縮單精度浮點值的雙四字移到目標運算元(第乙個運算元)。此指令可用於將 128 位記憶體位置的內容載入到 xmm 暫存器、將 xmm 暫存器的內容儲存到 128 位記憶體位置,或是在兩個 xmm 暫存器之間移動資料。源運算元或目標運算元是記憶體運算元時,運算元必須對齊 16 位元組邊界,否則將生成一般保護性異常 (#gp)。
要在未對齊的記憶體位置中移入/移出壓縮單精度浮點值,請使用 movups 指令。
再看rsp 的值是0x30f2e8
rsp+150h 的確是不被16整除
**引起的呢?
在保留暫存器的時候保留了15個暫存器,恰好不能被16 整除。所以出現了問題。
彙編寫**的時候要注意啊。
儲存 暫存器和記憶體
計算機儲存塔狀結構,暫存器最快,記憶體其次,最慢的是硬碟 同樣是電晶體儲存裝置,為什麼暫存器比記憶體快?一 距離不同 距離不是主要因素,但是最好理解,記憶體離cpu比較遠,所以要耗費更長時間讀取。以3ghz的cpu為例,電流每秒鐘 可以振盪30億次,每次耗時大約為0.33納秒。光在1納秒的時間內,可...
通用暫存器和記憶體
計算機在執行時,需要提供資料的容器 容器由記憶體和cpu提供,記憶體提供的容器比較多 cpu提供的容器較少但其中的資料計算速度快 cpu提供的容器就是暫存器,暫存器有特定的資料寬度,決定了該暫存器儲存資料的範圍 1.常用的32位暫存器 32位通用暫存器還可以拆分來使用 將低16位當做16位暫存器 一...
mysql 訪問暫存器 暫存器 記憶體訪問
一 ds和 address cpu要讀寫乙個記憶體單元的時候,必須先給出這個記憶體單元的位址,在8086pc中記憶體位址有段位址和偏移位址組成。ds 資料暫存器 中通常存放要訪問資料的段位址。比如要讀取1000h單元的內容,可以用下面這段 mov bx,1000h mov ds,bx mov al,...