sse 指令xmm寄存器和内存互相复制的问题
- 下面是一段可以执行的x64 的 nasm 汇编代码,类似可执行文件的外壳代码
bits 64
global start
extern MessageBoxAsection .text
start:push rbppush raxpush rbxpush rcxpush rdxpush rsipush rdipush r8push r9push r10push r11push r12push r13push r14push r15jmp real_callmessage: db 'hello',0caption: db 'msg',0
real_call:xor rcx,rcxmov rdx,messagemov r8,captionxor r9d,r9dsub rsp,28hcall MessageBoxAadd rsp,28hpop r15pop r14pop r13pop r12pop r11pop r10pop r9pop r8pop rdipop rsipop rdxpop rcxpop rbxpop rbpret
- 运行是崩溃的
- 这么简单的程序也会崩溃
- 没有什么逻辑啊???
看看出问题的是什么指令:
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 整除。所以出现了问题。
汇编写代码的时候要注意啊。
sse 指令xmm寄存器和内存互相复制的问题相关推荐
- 汇编之寄存器(内存访问)之字与字节的传送
文章目录 内存中字的存储 DS和[address] 字的传送 操作符X ptr 俗话说的好,温故而知新! 内存中字的存储 8086CPU中,用16位寄存器来存储一个字.高8位存放高位字节,低8位存放低 ...
- Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(1) - 概述/历史/新数据类型/XMM寄存器组
SSE Instructions SSE Overview & History Intel SSE技术的全称是Streaming SIMD Extension,中文译作流式单指令多数据指令扩展 ...
- 数据传送类指令LAD的数据传送方向是( )。 A 从寄存器到内存 B 从寄存器到寄存器 C 从内存到内存 D 从内存到寄存器...
LAD (Load Effective Address) 是一种数据传送类指令,它的数据传送方向是从内存到寄存器.因此答案是 D 从内存到寄存器. LAD 指令用于将某个内存地址中的值加载到寄存器中. ...
- 一些汇编指令和寄存器。
今天学习C中对于一些代码中,执行原理不是清楚的了解,如简单的字符型char数据,编译器是如何处理的.以及等等很多只看过程远远不能清楚了解内部原理,对于学习有很深的障碍.所有有必要去学习基础汇编与寄存器 ...
- java sse实例_使用SSE指令
回答(15) 2 years ago SSE指令是特定于处理器的 . 您可以在维基百科上查找哪个处理器支持哪个SSE版本 . 如果SSE代码更快或更快取决于许多因素:第一个当然是问题是内存限制还是CP ...
- 汇编语言:mov指令,寄存器,寻址
冯诺依曼计算机,将计算机分为5大部件:运算器,控制器,存储器,输入设备,输出设备.运算器和控制器共同执行指令.指令和数据一样,保存为二进制数据.运算器和控制器共同组成CPU,CPU执行机器指令,也就是 ...
- linux内存地址断点,开发一个 Linux 调试器(三):寄存器和内存
上一篇博文中我们给调试器添加了一个简单的地址断点.这次,我们将添加读写寄存器和内存的功能,这将使我们能够使用我们的程序计数器.观察状态和改变程序的行为. 注册我们的寄存器 在我们真正读取任何寄存器之前 ...
- ARM指令寻址方式之: 内存访问指令寻址
4.2 内存访问指令寻址 根据内存访问指令的分类,内存访问指令的寻址方式可以分为以下几种. ① 字及无符号字节的Load/Store指令的寻址方式. ② 杂类Load/Store指令的寻址方式. ③ ...
- [Win32]一个调试器的实现(四)读取寄存器和内存
[Win32]一个调试器的实现(四)读取寄存器和内存 作者:Zplutor 出处:http://www.cnblogs.com/zplutor/ 本文版权归作者和博客园共有,欢迎转载.但未经作者同 ...
最新文章
- 让你提升命令行效率的 Bash 快捷键 [完整版]
- centos yum安装python2.7及常见报错处理
- 提升安全性WindowsXP必禁的十大服务
- 【Vue案例三】使用v-if指令 / component标签实现组件的切换
- 一键搞定JavaEE应用,JTM1.0(JRE+Tomcat+MySQL绿色运行环境)
- 群体智能算法之蝙蝠算法
- 443端口与80端口
- 怎么防治计算机病毒,计算机病毒怎么防治
- Win10 更改不了注册表,重启之后恢复原样
- logstash 导入数据,查看每秒导入的数据量及已导入数量和已导入时间
- 单例设计模式(饿汉式VS懒汉式)
- VS2019中Git源代码管理总结
- python基础教程第三版豆瓣-数据结构与算法必读书单吐血整理推荐【附网盘链接】...
- Image Thresholding图像阙值化和Adaptive Thresholding
- vue项目中解决谷歌浏览器默认填充账号密码问题
- ISO 32000-2 国际标准7.7
- ch01_时间序列分析简介
- 网络安全威胁的主要内容
- 数值逼近课程设计(1)——runge现象
- 北大张铭教授:基于知识图谱的机器学习