回 帖 发 新 帖 刷新版面

主题:都来看看这道题,难.

这题是双字转ASCII的,你们看看谁能看懂,主要是里面的算法.
dwtoa proc dwValue:DWORD, lpBuffer:DWORD

    push ebx
    push esi
    push edi

    mov eax, dwValue
    mov edi, [lpBuffer]

    or eax,eax
    jnz sign
    
  zero:
    mov word ptr [edi],30h
    jmp dw2asc
    
  sign:
    jns pos
    mov byte ptr [edi],'-'
    neg eax
    inc edi

  pos:      
    mov ecx,429496730
    mov esi, edi

    .while (eax > 0)
      mov ebx,eax
      mul ecx
      mov eax,edx
      lea edx,[edx*4+edx]
      add edx,edx
      sub ebx,edx
      add bl,'0'
      mov [edi],bl
      inc edi
    .endw

    mov byte ptr [edi], 0     

    .while (esi < edi)
      dec edi
      mov al, [esi]
      mov ah, [edi]
      mov [edi], al
      mov [esi], ah
      inc esi
    .endw

    dw2asc:

    pop edi
    pop esi
    pop ebx

    ret

dwtoa endp[em19][em19][em18][em18]

回复列表 (共3个回复)

沙发


[em10][em10][em10][em10]

板凳

dwtoa proc dwValue:DWORD, lpBuffer:DWORD

    push ebx
    push esi
    push edi

    mov eax, dwValue
    mov edi, [lpBuffer]

    or eax,eax
    jnz sign    ;eax != 0 ?
    
  zero:
    mov word ptr [edi],30h
    jmp dw2asc
    
  sign:
    jns pos        ;eax < 0 ?
    mov byte ptr [edi],'-'
    neg eax        ;eax = |eax|
    inc edi

  pos:      
    mov ecx, 429496730
    mov esi, edi
    ;具体意思也不懂
    ;eax - (HIDWORD(eax * 429496730) * 10) = eax % 10
    .while (eax > 0) 
      mov ebx, eax     
      mul ecx                
      mov eax, edx
      lea edx, [edx*4+edx]    
      add edx, edx            ;edx *= 10
      sub ebx, edx
      add bl, '0'
      mov [edi], bl
      inc edi
    .endw

    mov byte ptr [edi], 0     

    .while (esi < edi)
      dec edi
      mov al, [esi]
      mov ah, [edi]
      mov [edi], al
      mov [esi], ah
      inc esi
    .endw

    dw2asc:

    pop edi
    pop esi
    pop ebx

    ret

dwtoa endp

3 楼

erping:
       我和你是一样的,都知道怎么回事,但是不知道,具体的算法是怎样的。
       为什么*429496730,让我一直想不通。
       不过还是很感谢你的回复的。

我来回复

您尚未登录,请登录后再回复。点此登录或注册