一段C++编译器生成的汇编代码,请高手帮忙解释一下

armos 2009-01-10 12:22:02
; Attributes: bp-based frame

sub_405598 proc near

var_4= dword ptr -4
arg_0= dword ptr 8

push ebp
mov ebp, esp
add esp, -8
mov eax, [ebp+arg_0]
cmp dword ptr [eax+5A4h], 0
jnz short loc_4055B1

---------------------------
loc_4055B1: ; flags
push 0
mov edx, 10010h
mov ecx, [ebp+arg_0]
sub edx, [ecx+59Eh]
push edx ; len
mov eax, [ebp+arg_0]
mov edx, [eax+5A4h]
mov ecx, [ebp+arg_0]
add edx, [ecx+59Eh]
push edx ; buf
mov eax, [ebp+arg_0]
push dword ptr [eax+0DDh] ; s
call recv
mov edx, [ebp+arg_0]
mov [edx+59Ah], eax
mov ecx, [ebp+arg_0]
cmp dword ptr [ecx+59Ah], 0FFFFFFFFh
jnz short loc_4055FF

---------------------------
loc_4055FF:
mov edx, [ebp+arg_0]
cmp byte ptr [edx+5A3h], 0
jz loc_4056AB

---------------------------
loc_4056AB:
mov ecx, [ebp+arg_0]
mov eax, [ecx+59Ah]
mov edx, [ebp+arg_0]
add [edx+59Eh], eax
mov ecx, [ebp+arg_0]
mov eax, [ecx+5A4h]
movzx edx, word ptr [eax+0Ch]
mov [ebp+var_4], edx
mov ecx, [ebp+arg_0]
mov eax, [ecx+59Eh]
add eax, 0FFFFFFF0h
cmp eax, [ebp+var_4]
jl short loc_405703

---------------------------
loc_405703:
xor eax, eax
pop ecx
pop ecx
pop ebp
retn
sub_405598 endp
...全文
144 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
nineforever 2009-01-15
  • 打赏
  • 举报
回复
5A4之类的偏移是结构中数据成员相对this指针的偏移。这里的arg0就是一个结构的指针
xtdumpling 2009-01-15
  • 打赏
  • 举报
回复
嗯,应该是3L说的那样
hawaii 2009-01-15
  • 打赏
  • 举报
回复
arg_0= dword ptr 8 // the offset of arg0

mov ecx, [ebp+arg_0]
sub edx, [ecx+59Eh]

mov ecx, [ebp+arg_0]
cmp dword ptr [ecx+59Ah], 0FFFFFFFFh

arg_0是8,是function的第一个参数arg0在stack frame上的偏移。我估计它是一个指针,指向一个结构体(或者是一个class)。因此,后面的[ecx+offset]应该就是引用结构体(或者class)的一个field。是一个典型的[base + offset]的寻址。
xabcxyz 2009-01-13
  • 打赏
  • 举报
回复
帮顶
armos 2009-01-10
  • 打赏
  • 举报
回复
cmp dword ptr [eax+5A4h], 0

sub edx, [ecx+59Eh]

关键是者两句中的5A4h和59Eh是怎么来的?请高手赐教。编译器应该是Borland C++。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧