高手,请帮忙看一段汇编.小弟我是小白,刚入门.关于cx的
高手,请帮忙看一段汇编.我是小白,刚入门.关于cx的.
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 在缓冲区中找出一行数据,处理换行并保存
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_FormatText proc uses esi _lpData,_dwSize,_hFile
local @szBuffer[128]:byte,@dwBytesWrite
mov esi,_lpData
mov ecx,_dwSize
lea edi,@szBuffer
xor edx,edx
cld
_LoopBegin:
or ecx,ecx
jz _WriteLine
lodsb
dec ecx
cmp al,0dh ;遇到0dh则丢弃
jz _LoopBegin
cmp al,0ah ;遇到0ah则扩展为0dh,0ah
jz _LineEnd
stosb
inc edx
cmp edx,sizeof @szBuffer-2
jae _WriteLine ;行缓冲区满则保存
jmp _LoopBegin
_LineEnd:
mov ax,0a0dh
stosw
inc edx
inc edx
_WriteLine:
push ecx ;============问题在这.为什么没人动cx,这里也要把他进栈啊,下面哪段代码懂了ecx?
.if edx
invoke WriteFile,_hFile,addr @szBuffer,edx,addr @dwBytesWrite,NULL
.endif
lea edi,@szBuffer
xor edx,edx
pop ecx ;;============问题在这.为什么没人动cx,这里也要把他进栈啊,
or ecx,ecx
jnz _LoopBegin
ret
_FormatText endp
新手没分.希望高手也能慷慨解答啊.万分感谢.
------解决方案--------------------
因为下面调用系统函数了,这里就涉及到一个寄存器的使用约定,子程里对 eax/edx/ecx 随意修改无须保护,保护操作应由调用者进行,esi/edi/ebx 则在使用时应进行保护和恢复操作;即对调用者来说,调用子程不会破坏 esi/edi/ebx 的内容,但 ecx/edx/eax 则可能被破坏,尤其是 [edx:]eax 通常作为返回内容几乎的必改。
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 在缓冲区中找出一行数据,处理换行并保存
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_FormatText proc uses esi _lpData,_dwSize,_hFile
local @szBuffer[128]:byte,@dwBytesWrite
mov esi,_lpData
mov ecx,_dwSize
lea edi,@szBuffer
xor edx,edx
cld
_LoopBegin:
or ecx,ecx
jz _WriteLine
lodsb
dec ecx
cmp al,0dh ;遇到0dh则丢弃
jz _LoopBegin
cmp al,0ah ;遇到0ah则扩展为0dh,0ah
jz _LineEnd
stosb
inc edx
cmp edx,sizeof @szBuffer-2
jae _WriteLine ;行缓冲区满则保存
jmp _LoopBegin
_LineEnd:
mov ax,0a0dh
stosw
inc edx
inc edx
_WriteLine:
push ecx ;============问题在这.为什么没人动cx,这里也要把他进栈啊,下面哪段代码懂了ecx?
.if edx
invoke WriteFile,_hFile,addr @szBuffer,edx,addr @dwBytesWrite,NULL
.endif
lea edi,@szBuffer
xor edx,edx
pop ecx ;;============问题在这.为什么没人动cx,这里也要把他进栈啊,
or ecx,ecx
jnz _LoopBegin
ret
_FormatText endp
新手没分.希望高手也能慷慨解答啊.万分感谢.
------解决方案--------------------
因为下面调用系统函数了,这里就涉及到一个寄存器的使用约定,子程里对 eax/edx/ecx 随意修改无须保护,保护操作应由调用者进行,esi/edi/ebx 则在使用时应进行保护和恢复操作;即对调用者来说,调用子程不会破坏 esi/edi/ebx 的内容,但 ecx/edx/eax 则可能被破坏,尤其是 [edx:]eax 通常作为返回内容几乎的必改。