求模试验
程序代码:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int i=10;
i=i%3;
return 0;
}
反汇编
程序代码:
.text:00411380 wmain proc near ; CODE XREF: j_wmainj
.text:00411380
.text:00411380 var_CC = byte ptr -0CCh
.text:00411380 var_8 = dword ptr -8
.text:00411380
.text:00411380 push ebp
.text:00411381 mov ebp, esp
.text:00411383 sub esp, 0CCh
.text:00411389 push ebx
.text:0041138A push esi
.text:0041138B push edi
.text:0041138C lea edi, [ebp+var_CC]
.text:00411392 mov ecx, 33h
.text:00411397 mov eax, 0CCCCCCCCh
.text:0041139C rep stosd
.text:0041139E mov [ebp+var_8], 0Ah int i=10;
.text:004113A5 mov eax, [ebp+var_8]
.text:004113A8 cdq CDQ该指令先把edx的每一位置成eax的最高位
.text:004113A9 mov ecx, 3
.text:004113AE idiv ecx
.text:004113B0 mov [ebp+var_8], edx i=i%3 用到的指令:idiv 带符号除法 商在eax,余数在edx
.text:004113B3 xor eax, eax return 0
.text:004113B5 pop edi
.text:004113B6 pop esi
.text:004113B7 pop ebx
.text:004113B8 mov esp, ebp
.text:004113BA pop ebp
.text:004113BB retn
.text:004113BB wmain endp
float 运算试验
程序代码:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
float i=10;
i=i/3;
return 0;
}
.text:00411380 wmain
proc near
; CODE XREF: j_wmainj
.text:00411380
.text:00411380 var_CC
= byte ptr -0CCh
.text:00411380 var_8
= dword ptr -8
.text:00411380
.text:00411380
push
ebp
.text:00411381
mov
ebp, esp
.text:00411383
sub
esp, 0CCh
.text:00411389
push
ebx
.text:0041138A
push
esi
.text:0041138B
push
edi
.text:0041138C
lea
edi, [ebp+var_CC]
.text:00411392
mov
ecx, 33h
.text:00411397
mov
eax, 0CCCCCCCCh
.text:0041139C
rep stosd
.text:0041139E
fld
ds:__real@41200000
FLD是Intel的指令集协处理器的汇编指令,FLD 指令用于把浮点数字传送入FPU寄存器.
ds:__real@41200000 处放的是 10的值
.text:004113A4
fstp
[ebp+var_8]
float i=10;
.text:004113A7
fld
[ebp+var_8]
再从存放i的地方拿出值 10
.text:004113AA
fdiv
ds:__real@4008000000000000
i%3
.text:004113B0
fstp
[ebp+var_8]
将运算结果给 i
.text:004113B3
xor
eax, eax
return 0;
.text:004113B5
pop
edi
.text:004113B6
pop
esi
.text:004113B7
pop
ebx
.text:004113B8
mov
esp, ebp
.text:004113BA
pop
ebp
.text:004113BB
retn
.text:004113BB wmain
endp
反汇编的东西 被杀毒软件给删了一点 文件
反出来的东西有点不正常了
float i=10 的过程和 int i=10的过程是不一样的
前者数据存放在数据段,以常量形式存在
后者是立即数的形式
前者在运算过程中,数据放在协处理器中
后者在运算过程中,数据放在寄存器中
数据仓库不一样 指令集不一样
float 数据空间探索
程序代码:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
float i=10;
float b=20.0;
i=i/3;
return 0;
}
.text:00411380 wmain
proc near
; CODE XREF: j_wmainj
.text:00411380
.text:00411380 var_D8
= byte ptr -0D8h
.text:00411380 var_14
= dword ptr -14h
.text:00411380 var_8
= dword ptr -8
.text:00411380
.text:00411380
push
ebp
.text:00411381
mov
ebp, esp
.text:00411383
sub
esp, 0D8h
.text:00411389
push
ebx
.text:0041138A
push
esi
.text:0041138B
push
edi
.text:0041138C
lea
edi, [ebp+var_D8]
.text:00411392
mov
ecx, 36h
.text:00411397
mov
eax, 0CCCCCCCCh
.text:0041139C
rep stosd
.text:0041139E
fld
ds:__real@41200000
.text:004113A4
fstp
[ebp+var_8]
var_14-var_8 =6字节
.text:004113A7
fld
ds:__real@41a00000
.text:004113AD
fstp
[ebp+var_14]
.text:004113B0
fld
[ebp+var_8]
.text:004113B3
fdiv
ds:__real@4008000000000000
.text:004113B9
fstp
[ebp+var_8]
.text:004113BC
xor
eax, eax
.text:004113BE
pop
edi
.text:004113BF
pop
esi
.text:004113C0
pop
ebx
.text:004113C1
mov
esp, ebp
.text:004113C3
pop
ebp
.text:004113C4
retn
.text:004113C4 wmain
endp
var_14-var_8 =6字节 也就是C在内存中给float 安排的是6个字节的数据空间
6个字节的数据空间小数部分占用几个字节,整数部分占用几个字节 从反汇编中看不出来
得写程序进行反应
破程序甲
不知道数据怎么存放的
程序代码:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int i,j;
float b=256.3;
printf("%f\n",b);
unsigned char *c;
c=(unsigned char*)&b;
for(i=0;i<6;i++){ //打印每个字节的二进制码
for(j=0;j<8;j++){
//printf("%d ",c[i]);
c[i]=c[i]>>7|c[i]<<1;
printf("%d ",c[i]&1);
}
printf("\n");
}
getchar();
return 0;
}
[
本帖最后由 zhu224039 于 2014-7-2 06:40 编辑 ]