汇编语言(找到下面提到的查询)
Assembly Language (Find the following query as mentioned below)
需要有关以下代码和查询的帮助。
我对下面代码的理解表明它会陷入无限循环。
- DemoFunction2 的 return 值是多少?
DemoFunction2 的用途是什么?
//
0:000> uf 010024d0
asmdemo2!DemoFunction2:
010024d0 55 push ebp
010024d1 8bec mov ebp,esp
010024d3 8b5508 mov edx,dword ptr [ebp+8]
010024d6 33c0 xor eax,eax
010024d8 b920000000 mov ecx,20h
010024dd d1ea shr edx,1
010024df 7301 jnc asmdemo2!DemoFunction2+0x12 (010024e2)
010024e1 40 inc eax
010024e2 e2f9 loop asmdemo2!DemoFunction2+0xd (010024dd)
010024e4 5d pop ebp
010024e5 c3 ret
0:000> r
eax=80002418 ebx=7ffd7000 ecx=00682295 edx=00000000 esi=80002418
edi=00000002
eip=010024d0 esp=0006fe98 ebp=0006fea8 iopl=0 nv up ei pl zr na
pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000246
asmdemo2!DemoFunction2:
010024d0 55 push ebp
0:000> dps esp
0006fe98 0100251c asmdemo2!main+0x20
0006fe9c 80002418
0006fea0 00000002
0006fea4 00000000
0006fea8 0006ff88
0006feac 01002969 asmdemo2!_mainCRTStartup+0x12c
0006feb0 00000002
0006feb4 00682270
0006feb8 006822b8
0006febc f395c17d
0006fec0 00000000
0006fec4 00000000
0006fec8 7ffd7000
0006fecc 00000000
0006fed0 00000000
0006fed4 00000000
0006fed8 00000094
0006fedc 00000006
0006fee0 00000000
0006fee4 00001771
0006fee8 00000002
0006feec 76726553
0006fef0 20656369
0006fef4 6b636150
0006fef8 00003120
0006fefc 00000000
0006ff00 00000000
0006ff04 00000000
0006ff08 00000000
0006ff0c 00000000
0006ff10 00000000
0006ff14 00000000
不,这不是无限循环。
一开始ecx
设置为32.
每次 loop
instruction 执行时 ecx 减 1。
当 ecx 达到 0 时,循环指令将落空(不是跳转),并执行其后的指令(pop
+ret
)。
显然代码效率低下。
一个简单的
popcnt eax,[esp+4]
ret
执行相同的功能会更快,但它确实有效。
它使用 cdecl 调用约定计算第一个参数中设置位的数量。
需要有关以下代码和查询的帮助。
我对下面代码的理解表明它会陷入无限循环。
- DemoFunction2 的 return 值是多少?
DemoFunction2 的用途是什么?
// 0:000> uf 010024d0 asmdemo2!DemoFunction2: 010024d0 55 push ebp 010024d1 8bec mov ebp,esp 010024d3 8b5508 mov edx,dword ptr [ebp+8] 010024d6 33c0 xor eax,eax 010024d8 b920000000 mov ecx,20h 010024dd d1ea shr edx,1 010024df 7301 jnc asmdemo2!DemoFunction2+0x12 (010024e2) 010024e1 40 inc eax 010024e2 e2f9 loop asmdemo2!DemoFunction2+0xd (010024dd) 010024e4 5d pop ebp 010024e5 c3 ret 0:000> r eax=80002418 ebx=7ffd7000 ecx=00682295 edx=00000000 esi=80002418 edi=00000002 eip=010024d0 esp=0006fe98 ebp=0006fea8 iopl=0 nv up ei pl zr na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246 asmdemo2!DemoFunction2: 010024d0 55 push ebp 0:000> dps esp 0006fe98 0100251c asmdemo2!main+0x20 0006fe9c 80002418 0006fea0 00000002 0006fea4 00000000 0006fea8 0006ff88 0006feac 01002969 asmdemo2!_mainCRTStartup+0x12c 0006feb0 00000002 0006feb4 00682270 0006feb8 006822b8 0006febc f395c17d 0006fec0 00000000 0006fec4 00000000 0006fec8 7ffd7000 0006fecc 00000000 0006fed0 00000000 0006fed4 00000000 0006fed8 00000094 0006fedc 00000006 0006fee0 00000000 0006fee4 00001771 0006fee8 00000002 0006feec 76726553 0006fef0 20656369 0006fef4 6b636150 0006fef8 00003120 0006fefc 00000000 0006ff00 00000000 0006ff04 00000000 0006ff08 00000000 0006ff0c 00000000 0006ff10 00000000 0006ff14 00000000
不,这不是无限循环。
一开始ecx
设置为32.
每次 loop
instruction 执行时 ecx 减 1。
当 ecx 达到 0 时,循环指令将落空(不是跳转),并执行其后的指令(pop
+ret
)。
显然代码效率低下。
一个简单的
popcnt eax,[esp+4]
ret
执行相同的功能会更快,但它确实有效。
它使用 cdecl 调用约定计算第一个参数中设置位的数量。