首页 > 试题广场 >

func: &nbs...

[问答题]
func:
        mov     ecx, eax
        lea     edx, [ecx+1]
loop:
        mov     al, [ecx]
        inc     ecx
        test    al, al
        jnz     loop
        sub     ecx, edx
        mov     eax, ecx
        ret


reverse:
        mov     ebp, eax ;eax为输入的参数1
        mov     edi, edx ;edx为输入的参数2
        mov     esi, ebx ;ebx为输入的参数3

        mov     eax, ebp
        call    func
        push    eax

        xor     ebx, ebx
        xor     ecx, ecx
        xor     ebp, ebp
        jmp     label4

label1:
        lea     eax, [ebp*4]
        add     eax, edi
        mov     eax, [eax]
        cmp     eax, ecx
        jbe     label2

        mov     ebx, ecx
        mov     ecx, eax
        jmp     label3

label2:
        cmp     eax, ebx
        jbe     label3

        mov     ebx, eax

label3:
        inc     ebp

label4:
        cmp     ebp, esi
        jb      label1
        pop     eax
        add     eax, ebx
        add     eax, ecx
        ret

以上为汇编码的两个函数func和reverse,分析这两个函数并编写等价的C代码函数
int func(char *pchar){
	char* p = pchar + 1;
	while(*(pchar++) != 0);
	return (int)pchar - (int)p;

}
int reverse(char* pchar, int* pint, int arg3){
	int len = func(pchar);
	int i = 0, ebx = 0, ecx = 0;
	while(i < arg3){
		if(pint[i] <= ecx){
			if(pint[i] <= ebx)i++;
			else ebx = pint[i++];
		}
		else{
			ebx = ecx;
			ecx = pint[i++];
		}
	}
	len += ebx;
	len += ecx;
	return len;
}
避免麻烦,直接使用寄存器名当变量名。

发表于 2020-08-20 10:05:29 回复(0)