• 下面是一段可以执行的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寄存器和内存互相复制的问题相关推荐

  1. 汇编之寄存器(内存访问)之字与字节的传送

    文章目录 内存中字的存储 DS和[address] 字的传送 操作符X ptr 俗话说的好,温故而知新! 内存中字的存储 8086CPU中,用16位寄存器来存储一个字.高8位存放高位字节,低8位存放低 ...

  2. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(1) - 概述/历史/新数据类型/XMM寄存器组

    SSE Instructions SSE Overview & History Intel SSE技术的全称是Streaming SIMD Extension,中文译作流式单指令多数据指令扩展 ...

  3. 数据传送类指令LAD的数据传送方向是( )。 A 从寄存器到内存 B 从寄存器到寄存器 C 从内存到内存 D 从内存到寄存器...

    LAD (Load Effective Address) 是一种数据传送类指令,它的数据传送方向是从内存到寄存器.因此答案是 D 从内存到寄存器. LAD 指令用于将某个内存地址中的值加载到寄存器中. ...

  4. 一些汇编指令和寄存器。

    今天学习C中对于一些代码中,执行原理不是清楚的了解,如简单的字符型char数据,编译器是如何处理的.以及等等很多只看过程远远不能清楚了解内部原理,对于学习有很深的障碍.所有有必要去学习基础汇编与寄存器 ...

  5. java sse实例_使用SSE指令

    回答(15) 2 years ago SSE指令是特定于处理器的 . 您可以在维基百科上查找哪个处理器支持哪个SSE版本 . 如果SSE代码更快或更快取决于许多因素:第一个当然是问题是内存限制还是CP ...

  6. 汇编语言:mov指令,寄存器,寻址

    冯诺依曼计算机,将计算机分为5大部件:运算器,控制器,存储器,输入设备,输出设备.运算器和控制器共同执行指令.指令和数据一样,保存为二进制数据.运算器和控制器共同组成CPU,CPU执行机器指令,也就是 ...

  7. linux内存地址断点,开发一个 Linux 调试器(三):寄存器和内存

    上一篇博文中我们给调试器添加了一个简单的地址断点.这次,我们将添加读写寄存器和内存的功能,这将使我们能够使用我们的程序计数器.观察状态和改变程序的行为. 注册我们的寄存器 在我们真正读取任何寄存器之前 ...

  8. ARM指令寻址方式之: 内存访问指令寻址

    4.2  内存访问指令寻址 根据内存访问指令的分类,内存访问指令的寻址方式可以分为以下几种. ① 字及无符号字节的Load/Store指令的寻址方式. ② 杂类Load/Store指令的寻址方式. ③ ...

  9. [Win32]一个调试器的实现(四)读取寄存器和内存

    [Win32]一个调试器的实现(四)读取寄存器和内存 作者:Zplutor  出处:http://www.cnblogs.com/zplutor/  本文版权归作者和博客园共有,欢迎转载.但未经作者同 ...

最新文章

  1. C语言经典例83-求0—7所能组成的奇数个数
  2. 上传附件删除、session清空问题
  3. vue获取前一个页面路由地址
  4. 大数据开发初学者学习路线_初学者的Web开发路线图
  5. java 重载匹配_关于Java重载方法匹配优先级
  6. if条件判断C语言,if条件判断语句,谁能帮我分析一下?
  7. Java多线程系列 面试题
  8. matlab2c使用c++实现matlab函数系列教程-perms函数
  9. unity中移动lindrender和transform, 两个点的位置
  10. 工作上碰到的技术问题积累
  11. Element-UI el-table组件表格打印
  12. 这 10 个 Python 可视化工具,你用过哪些?
  13. 文件和文件之间的 相对路径 绝对路径的访问(之前总是容易忘记)
  14. _crol_和_cror_的使用
  15. 打鱼晒网C语言程序,C语言打鱼还是晒网问题
  16. 工作流模式的学习与总结
  17. 问题解答:No active profile set, falling back to default profiles: default
  18. Sybase ASE 查询当前版本和所有数据库
  19. 【网络安全】利用MSF工具内网复现MS08-067
  20. vector容器用法详解

热门文章

  1. 进口零食最受欢迎排行榜
  2. IDEA中文件或文件夹 如何重命名?解决方法如下
  3. Canvas画钟 js
  4. Arduino 四针脚声音传感器
  5. Android 四大天王-- 三个
  6. Poly-YOLO:更快,更精确的检测(主要解决Yolov3两大问题,附源代码)
  7. 2016年,对我影响最大的三本书
  8. Unity流水账8:MeshComponents
  9. 注意避坑,Vue Router 4: 路由参数在 created/setup 时不可用
  10. Hive 正则表达式 判断字符串是否是数字(整数)