作者:pmason_rose 此贴贴于2019-10-14 15:09:40,已被阅读401次/回复1 
见内
; ------------------------------------------------------------------------
; void* memcpy(void* es:p_dst, void* ds:p_src, int size);
; ------------------------------------------------------------------------
memcpy:
    push    ebp
    mov    ebp, esp
    push    esi
    push    edi
    push    ecx
    mov    edi, [ebp + 8]    ; Destination
    mov    esi, [ebp + 12]    ; Source
    mov    ecx, [ebp + 16]    ; Counter
mc1:
    cmp    ecx, 0        ; 判断计数器
    jz    mc2        ; 计数器为零时跳出
    mov    al,ds:[esi]        ; ┓
    inc    esi            ; ┃
                    ; ┣ 逐字节移动
    mov    byte ptr es:[edi], al    ; ┃
    inc    edi            ; ┛
    dec    ecx        ; 计数器减一
    jmp    mc1        ; 循环
mc2:
    mov    eax, [ebp + 8]    ; 返回值
    pop    ecx
    pop    edi
    pop    esi
    mov    esp, ebp
    pop    ebp
    ret            ; 函数结束,返回

; ------------------------------------------------------------------------
; void memset(void* p_dst, char ch, int size);
; ------------------------------------------------------------------------
memset:
    push    ebp
    mov    ebp, esp
    push    esi
    push    edi
    push    ecx
    mov    edi, [ebp + 8]    ; Destination
    mov    edx, [ebp + 12]    ; Char to be putted
    mov    ecx, [ebp + 16]    ; Counter
mms1:
    cmp    ecx, 0        ; 判断计数器
    jz    mms2        ; 计数器为零时跳出
    mov    byte ptr[edi], dl        ; ┓
    inc    edi            ; ┛
    dec    ecx        ; 计数器减一
    jmp    mms1        ; 循环
mms2:
    pop    ecx
    pop    edi
    pop    esi
    mov    esp, ebp
    pop    ebp
    ret            ; 函数结束,返回
    
; ------------------------------------------------------------------------
; char* strcpy(char* p_dst, char* p_src);
; ------------------------------------------------------------------------
strcpy:
    push    ebp
    mov     ebp, esp
    mov     esi, [ebp + 12] ; Source
    mov     edi, [ebp + 8]  ; Destination
strcy1:
    mov     al, [esi]               ; ┓
    inc     esi                     ; ┃
                    ; ┣ 逐字节移动
    mov     byte ptr[edi], al          ; ┃
    inc     edi                     ; ┛
    cmp     al, 0           ; 是否遇到 '\0'
    jnz     strcy1              ; 没遇到就继续循环,遇到就结束
    mov     eax, [ebp + 8]  ; 返回值
    pop     ebp
    ret                     ; 函数结束,返回
    
; ------------------------------------------------------------------------
; int strlen(char* p_str);
; ------------------------------------------------------------------------
strlen:
        push    ebp
        mov     ebp, esp
        mov     eax, 0                  ; 字符串长度开始是 0
        mov     esi, [ebp + 8]          ; esi 指向首地址
strlen1:
        cmp     byte ptr[esi], 0           ; 看 esi 指向的字符是否是 '\0'
        jz      strlen2                      ; 如果是 '\0',程序结束
        inc     esi                     ; 如果不是 '\0',esi 指向下一个字符
        inc     eax                     ;         并且,eax 自加一
        jmp     strlen1                      ; 如此循环
strlen2:
        pop     ebp
        ret                             ; 函数结束,返回


点击这里给我发消息

此贴的父贴(直接):
怎么把c语言中的strlen, strcmp, strcpy, strcat, atoi, itoa函数用汇编语言写出来,求详解或代码426 pxrwana 2019-10-13 17:57:03 0 正常
此贴的回复贴(直接):
memcpy 可以 vectorize 来优化。现代 CPU 一般支持 Advanced Vector Extensions.216 ohc9yaeW 2020-1-19 21:48:37 0 正常