首页
社区
课程
招聘
[求助]怀疑系统调用没有还原ECX
发表于: 2013-6-22 22:35 6141

[求助]怀疑系统调用没有还原ECX

2013-6-22 22:35
6141
	.386
	.model flat,stdcall
	option casemap:none
;include files
include		windows.inc
include		kernel32.inc
includelib	kernel32.lib
include 	masm32.inc
includelib	masm32.lib

	.data
	szNum		db	'12'
	.code
;==================================
start:
	invoke a2dw,addr  szNum 
	mov edx,eax ;为了看此处eax的值
	invoke	ExitProcess,NULL
	end start

源码很简单,就是想用一下masm32中的a2dw函数。我用的是masm32v11r版本。但是结果总是不对,我把可执行文件用od调试,发现a2dw函数中会用到lstrlen函数获取szNum的长度,但lstrlen返回后,ECX的值就变了,然后就影响了a2dw的运算结果。照理讲,不应该会出现这种情况吧,求验证解释。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 952
活跃值: (1821)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
eax ecx edx stdcall 不会还原的
2013-6-22 22:57
0
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
EAX ECX EDX 是易变寄存器,函数内部没有规定需要保护现场
2013-6-22 23:47
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
不用怀疑,系统不会帮你保存ecx的,

ps,以前觉得汇编牛B,现在觉得汇编累赘,像现在这种情况,一个所谓的ecx都得注意保存
2013-6-23 00:17
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢各位回答。
那是不是这个函数等于不能用了啊。
2013-6-23 10:12
0
雪    币: 4560
活跃值: (1002)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
调用前保存,调用后恢复
2013-6-23 12:19
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
a2dw函数包含在masm32.lib中,它需要使用ECX,但调用了lstrlen函数,改变了a2dw函数内部的ECX值。
2013-6-23 22:02
0
雪    币: 57
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
楼主你调用错了函数。 应为 atodw ,非a2dw
2013-6-23 22:33
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
还真是。那a2dw是用在何处?
2013-6-26 22:00
0
游客
登录 | 注册 方可回帖
返回
//