汇编中call printf参数压栈时错误理解

EAX, ECX,EDX,EBX均可以32bit,16bit,8bit访问,如下所示:

<-------------------EAX------------------------>
|<----------------------|-----------|----------->|
             |<---------AX--------->|
             |<---AH--->|<---AL--->|

  测试代码如下:

 1 .section .data
 2 output:
 3     .asciz "Value is:%x\n"
 4 val:
 5     .int 0
 6     
 7 .section .text
 8 .globl main
 9 main:
10     nop
11     movl $0x12345678, %eax
12     movl $0, %ecx
13     movw %ax, %cx
14     pushw %cx
15     pushl $output
16     call printf
17     addl $6, %esp
18     
19     movl $1, %eax
20     movl $0, %ebx
21     int $0x80

  我的电脑是小端格式(MSB存于高位),所以预期的输出结果是:0x5678,但是我编译执行后结果是:0x2dec5678,前面多出了2个字节,但是明明我压栈的时候使用的pushw,原来是printf获取参数时使用的是4字节长度,所以虽然我压入的只有2个字节,但是它访问时以4字节访问。

  将代码修改:

 1 .section .data
 2 output:
 3     .asciz "Value is:%x\n"
 4 val:
 5     .int 0
 6     
 7 .section .text
 8 .globl main
 9 main:
10     nop
11     movl $0x12345678, %eax
12     movl %eax, %ecx
13     pushl %ecx
14     pushl $output
15     call printf
16     addl $8, %esp
17 
18     movl $0, %ecx
19     movw %ax, %cx
20     pushl %ecx
21     pushl $output
22     call printf
23     addl $8, %esp
24     
25     movl $1, %eax
26     movl $0, %ebx
27     int $0x80

  预期输出:

    Value is:12345678
    Value is:5678

  结果输出:

    Value is:12345678
    Value is:12

   起先还以为是将0x12345678的最高字节0x12传送到cx里面了,觉得相当怪异,明明使用的是movw,要错也是0x1234,分析了下,原来又是printf作怪,函数调用后,其返回值一般是存储在eax里面来传递的,而第一个printf的输出:Value is:12345678恰好有0x12,18个字符(含'\n'),所以代码执行完15行的call后,eax的值已被printf的返回值修改,而不是我预期的0x12345678。所以汇编里面调用库函数时,要特别注意某些特殊寄存器的特殊用途,特别是这些库是由其他高级语言通过编译工具生成的时候。

转载于:https://www.cnblogs.com/thammer/p/4311621.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406293.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ajax传输json数据格式乱码_解决Ajax加载JSon数据中文乱码问题

一、问题描述使用zTree的异步刷新父级菜单时&#xff0c;服务器返回中文乱码&#xff0c;但项目中使用了SpringMvc&#xff0c;已经对中文乱码处理&#xff0c;为什么还会出现呢&#xff1f;此处为的异步请求的配置&#xff1a;Java代码async: {enable: true,url: basePath /s…

在命令提示符下输入的命令

ASSOC 显示或修改文件扩展名关联。ATTRIB 显示或更改文件属性。BREAK 设置或清除扩展式 CTRLC 检查。BOOTCFG 设置 boot.ini 文件的属性以便控制启动加载。CACLS 显示或修改文件的访问控制列表(ACL)。CALL 从另一个批处理…

(转载)WebSphere MQ安装过程

参考文档&#xff1a; http://www.ibm.com/developerworks/cn/linux/linux-speed-start/l-ss-mq/ 转载于:https://www.cnblogs.com/lichmama/p/4312577.html

Vue.config.productionTip = false 是什麽意思

Vue.config.productionTip false 是什麽意思

non-aggregates cannot be initialized with initializer list

From: http://blog.csdn.net/sp_daiyq/article/details/7008990 我定义了一个结构体&#xff0c;示意如下&#xff1a; [cpp] view plaincopyStruct A { int x; CString test; }; 然后我定义一个变量同时对其进行串行初始化&#xff1a; A a {0, "hello&q…

xxljob 配置具体定时任务_记一次xxl-job定时任务没有触发的问题

当初选了xxl-job就是因为它的触发机制比较靠谱,到点准时发,而且有日志可以看。 昨天突然发现部署在一台本地机器上的xxl-job到点并没有触发,且没有任何日志。通过管理页面查询触发日志,发现日志还是有的,只是和筛选条件不甚匹配。比如选取了昨天的日志,结果集中包含了今天…

TOMCAT启动完成但是ECLIPSE仍然显示starting....

最近重新部署了一个TOMCAT服务&#xff0c;但是启动碰到个问题&#xff0c;虽然TOMCAT控制台已显示启动成功&#xff0c;但是ECLIPSE右下角仍然一直显示STARTING&#xff0c;最后TOMCAT超时&#xff0c;启动失败。之前以为是拷贝工程的问题&#xff0c;但其实是SERVER配置的问题…

StatusCodeError: 400 - “{\“code\“:40000,\“error\“:\“错误 Error: 登录用户不是该小程序的开发者

StatusCodeError: 400 - “{\“code\“:40000,\“error\“:\“错误 Error: 登录用户不是该小程序的开发者

例解 autoconf 和 automake 生成 Makefile 文件

From: http://www.ibm.com/developerworks/cn/linux/l-makefile/ 简介&#xff1a; 本文介绍了在 linux 系统中&#xff0c;通过 Gnu autoconf 和 automake 生成 Makefile 的方法。主要探讨了生成 Makefile 的来龙去脉及其机理&#xff0c;接着详细介绍了配置 Configure.in 的方…

爱慕内衣信息化颠覆流程重构供应链

通过IT&#xff0c;爱慕内衣进行了供应链流程的颠覆和重构。在北京慕集团首席信息官赵先生脑海中&#xff0c;一直有着这样一幅“大图景”&#xff1a;只要需要&#xff0c;老总在自己的办公室里能看到每一寸原料的采购情况&#xff0c;每一件成衣的生产和销售情况&#xff0c;…

mysql中 课程1比课程2成绩高_小菜菜mysql练习解读分析1——查询 01 课程比 02 课程成绩高的学生的信息及课程分数...

查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数好的&#xff0c;第一道题&#xff0c;刚开始做&#xff0c;就栽了个跟头&#xff0c;爽歪歪&#xff0c;至于怎么栽跟头的——需要分析题目&#xff0c;查询的是&#xff0c;查询的是(1)学生的信息…

专门讲讲这个MYSQL授权当中的with grant option的作用

对象的owner将权限赋予某个用户(如:testuser1) grant select ,update on bd_corp to testuser1 [with grant option ]1.如果带了 with grant option 那么用户testuser1可以将select ,update权限传递给其他用户( 如testuser2)grant select,update on bd_corp to testuser22.如果…

HBuilder更改为自定义的背景颜色

HBuilder更改为自定义的背景颜色

Linux下Makefile的automake生成全攻略

From: http://fanqiang.chinaunix.net/system/linux/2005-12-14/3926.shtml 作为Linux下的程序开发人员&#xff0c;大家一定都遇到过Makefile&#xff0c;用make命令来编译自己写的程序确实是很方便。一般情况下&#xff0c;大家都是手工写一个简单Makefile&#xff0c;如果要…

mysql中limit 0 20_MYSQL 中 LIMIT 用法

mapper文件中的sql&#xff1a;--------------------------------------------------------------------------------------------(在实体类中定义的属性)start:从第几条记录开始。size:读取几条记录。select id"findAllUsers" parameterType"Map" resultT…

VSFTP配置详解+虚拟用户的支持

FTP 搭建第一部分&#xff1a;理论一. FTP服务器的基本原理1. 基本概念&#xff1a;ftp是文件传输协议&#xff0c;&#xff08;file transport portocol&#xff09;2. 数据传输模式&#xff1a;主动模式和被动模式 &#xff08;要和binary ascii 区分一下&#xff09;3. 使用…