首页
社区
课程
招聘
[旧帖] [求助]在看雪论坛中看到一篇文章里有处不明白,希望大虾给小弟讲解以下 0.00雪花
发表于: 2010-3-30 12:52 1601

[旧帖] [求助]在看雪论坛中看到一篇文章里有处不明白,希望大虾给小弟讲解以下 0.00雪花

2010-3-30 12:52
1601
0040140F |. E8 B4000000        CALL <JMP.&KERNEL32.GetDriveTypeA>          ; \GetDriveTypeA
00401414 |. A2 EC334000        MOV BYTE PTR DS:[4033EC],AL                 ; 磁盘类型参数送内存地址4033EC

地址 0040140F 处的那条指令是调用 GetDriveTypeA 函数,一般函数调用后的返回值都保存在 EAX 中,所以地址 00401414 处的那一句 MOV BYTE PTR DS:[4033EC],AL 就是传递返回值。

如上面一段是http://bbs.pediy.com/showthread.php?t=21378这篇文章中的原话,我有点不明白 MOV BYTE PTR DS:[4033EC],AL 为什么就是传递返回值,这里的AL与EAX有什么联系啊?

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

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 435
活跃值: (1277)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
2
al为ax寄存器的低8位,相应的ah为ax寄存器的高8位,al长度为一个字节,ax长度为两个字节

win32以后,ax扩展为eax,变成4字节长度
而GetDriveTypeA函数的返回值只需要一个字节足够,所以只保存它的最低8位(即一个字节)即可
这时候al=eax的
2010-3-30 13:09
0
雪    币: 54
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
LZ还是再仔细复习一下80x86CPU原理吧~
四个通用寄存器:AX,BX,CX,DX
都是16位寄存器,存在于早期的8086/8088类型的16位CPU中
他们各自分为两段:高八位(AH,BH,CH,DH)和低八位(AL,BL,CL,DL)
所以你这里的AL其实就是AX的低八位。
而到后来出现32位CPU之后,为了向下兼容,并没有换掉这几个寄存器,而只是在原本的16位寄存器前又加了16位
和在一起的32位寄存器命名为:EAX,EBX,ECX,EDX
而他们的低十六位还是原来的:AX,BX,CX,DX。低十六位中的高八位和低八位也还是那些没变~~

p.s.
至于64位CPU,其实一样,就是在32位寄存器前面又扩充了32位。
变成:RAX,RBX,RCX,RDX~~
2010-3-30 13:45
0
雪    币: 116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢楼上二位,小弟明白了
2010-3-30 15:00
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
受益匪浅感谢各位老师!
2010-3-31 00:29
0
游客
登录 | 注册 方可回帖
返回
//