生活随笔
收集整理的這篇文章主要介紹了
sse 指令xmm寄存器和内存互相复制的问题
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
- 下面是一段可以執(zhí)行的x64 的 nasm 匯編代碼,類似可執(zhí)行文件的外殼代碼
bits
64
global start
extern MessageBoxAsection .text
start:
push rbp
push rax
push rbx
push rcx
push rdx
push rsi
push rdi
push r8
push r9
push r1
0push r11
push r12
push r13
push r14
push r15jmp real_callmessage: db
'hello',
0caption: db
'msg',
0
real_call:
xor rcx,rcxmov rdx,messagemov r8,caption
xor r9d,r9d
sub rsp,28hcall MessageBoxAadd rsp,28hpop r15pop r14pop r13pop r12pop r11pop r10pop r9pop r8pop rdipop rsipop rdxpop rcxpop rbxpop rbpret
- 運(yùn)行是崩潰的
- 這么簡(jiǎn)單的程序也會(huì)崩潰
- 沒(méi)有什么邏輯啊???
看看出問(wèn)題的是什么指令:
movaps xmmword ptr [rsp+
150h],xmm8
提示
:Access violation - code
C0000005
查看棧rsp 并沒(méi)有出問(wèn)題
再查看一下 movaps 指令
:
在網(wǎng)上查到這條指令說(shuō)明:
從源操作數(shù)(第二個(gè)操作數(shù))將包含四個(gè)壓縮單精度浮點(diǎn)值的雙四字移到目標(biāo)操作數(shù)(第一個(gè)操作數(shù))。此指令可用于將
128 位內(nèi)存位置的內(nèi)容加載到
XMM 寄存器、將
XMM 寄存器的內(nèi)容存儲(chǔ)到
128 位內(nèi)存位置,或是在兩個(gè)
XMM 寄存器之間移動(dòng)數(shù)據(jù)。源操作數(shù)或目標(biāo)操作數(shù)是內(nèi)存操作數(shù)時(shí),操作數(shù)必須對(duì)齊
16 字節(jié)邊界,否則將生成一般保護(hù)性異常 (要在未對(duì)齊的內(nèi)存位置中移入/移出壓縮單精度浮點(diǎn)值,請(qǐng)使用
MOVUPS 指令。
再看rsp 的值是0x30f2e8
rsp+150h 的確是不被16整除
哪里引起的呢?
在保留寄存器的時(shí)候保留了15個(gè)寄存器,恰好不能被16 整除。所以出現(xiàn)了問(wèn)題。
匯編寫代碼的時(shí)候要注意啊。
總結(jié)
以上是生活随笔為你收集整理的sse 指令xmm寄存器和内存互相复制的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。