strcat的反汇编程序
下面给出strcat的反汇编程序(有一点小问题,都标在注释中)
;c library function
;function prototype:char* strcat(char* s,const char* ct);
_strcat proc far
arg_0 =dword ptr 6
arg_4 =dword ptr 0ah
push bp
mov bp,sp
push si
push di
push ds
mov ax,seg STRCAT_DATA ;s 和ct的段基址
mov ds,ax
assume ds:STRCAT_DATA ;问题1:为什么用ds而不用es,后面的scasb操作可是用es作用段基址的呀
cld
les di,[bp+arg_0]
mov dx,di
xor al,al
mov cx,0ffffh
repne scasb ;我们把di指向字符串的结束标志
push es ;后面会改变它,先保存
lea si,[di-1] ;问题2:为什么要把si指向最后一个字符呢?指向结束标志不是更好吗?因为strcat
;的开始位置可是结束标志呀
les di,[bp+arg_4] ;为什么arg_4=0ah?我觉得应该是等于8呀
mov cx,0ffffh
repne scasb
not cx ;cx计算ct字符串的长度
sub di,cx ;di现在指向ct字符串的第一个字符
push es
pop ds
assume ds:nothing
pop es ;原先保存了一次
xchg si,di
test si,1 ;对齐检查
jz Align
movsb
dec cx
Align:
shr cx,1
rep movsw ;提高速度
jnb short loc_3c ;Q:CY=0?
movsb ;cy=1,还有一个字节的数据
loc_3c:
mov ax,dx ;ax保存返回值
mov dx,es
jmp short $+2
pop ds
pop di
pop si
pop bp
_strcat endp
谁能说说这3个问题???????
这个程序是C库函数是的源程序的反汇编代码,大家可以想想利用32位机的特性改进这个程序