?? string.asm
字號(hào):
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; string.asm
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Forrest Yu, 2005
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[SECTION .text]
; 導(dǎo)出函數(shù)
global memcpy
global memset
global strcpy
global strlen
; ------------------------------------------------------------------------
; 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
.1:
cmp ecx, 0 ; 判斷計(jì)數(shù)器
jz .2 ; 計(jì)數(shù)器為零時(shí)跳出
mov al, [ds:esi] ; ┓
inc esi ; ┃
; ┣ 逐字節(jié)移動(dòng)
mov byte [es:edi], al ; ┃
inc edi ; ┛
dec ecx ; 計(jì)數(shù)器減一
jmp .1 ; 循環(huán)
.2:
mov eax, [ebp + 8] ; 返回值
pop ecx
pop edi
pop esi
mov esp, ebp
pop ebp
ret ; 函數(shù)結(jié)束,返回
; memcpy 結(jié)束-------------------------------------------------------------
; ------------------------------------------------------------------------
; 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
.1:
cmp ecx, 0 ; 判斷計(jì)數(shù)器
jz .2 ; 計(jì)數(shù)器為零時(shí)跳出
mov byte [edi], dl ; ┓
inc edi ; ┛
dec ecx ; 計(jì)數(shù)器減一
jmp .1 ; 循環(huán)
.2:
pop ecx
pop edi
pop esi
mov esp, ebp
pop ebp
ret ; 函數(shù)結(jié)束,返回
; memset 結(jié)束-------------------------------------------------------------
; ------------------------------------------------------------------------
; char* strcpy(char* p_dst, char* p_src);
; ------------------------------------------------------------------------
strcpy:
push ebp
mov ebp, esp
mov esi, [ebp + 12] ; Source
mov edi, [ebp + 8] ; Destination
.1:
mov al, [esi] ; ┓
inc esi ; ┃
; ┣ 逐字節(jié)移動(dòng)
mov byte [edi], al ; ┃
inc edi ; ┛
cmp al, 0 ; 是否遇到 '\0'
jnz .1 ; 沒(méi)遇到就繼續(xù)循環(huán),遇到就結(jié)束
mov eax, [ebp + 8] ; 返回值
pop ebp
ret ; 函數(shù)結(jié)束,返回
; strcpy 結(jié)束-------------------------------------------------------------
; ------------------------------------------------------------------------
; int strlen(char* p_str);
; ------------------------------------------------------------------------
strlen:
push ebp
mov ebp, esp
mov eax, 0 ; 字符串長(zhǎng)度開(kāi)始是 0
mov esi, [ebp + 8] ; esi 指向首地址
.1:
cmp byte [esi], 0 ; 看 esi 指向的字符是否是 '\0'
jz .2 ; 如果是 '\0',程序結(jié)束
inc esi ; 如果不是 '\0',esi 指向下一個(gè)字符
inc eax ; 并且,eax 自加一
jmp .1 ; 如此循環(huán)
.2:
pop ebp
ret ; 函數(shù)結(jié)束,返回
; ------------------------------------------------------------------------
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -