sse 指令xmm暫存器和記憶體互相複製的問題

2021-08-14 11:36:40 字數 1343 閱讀 5499

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,...