我正在尝试在 asm 中实现我自己的 strncmp。这是 NASM 代码:
section .text
global my_strncmp
my_strncmp:
mov rcx, 0; using rcx like counter
.next:
cmp rdx, rcx ; i think this comparing doesn't work (i have no idea with it)
je .return_0
mov dh, byte [rdi]
mov dl, byte [rsi]
cmp byte [rdi], 0
je .return_0 ;string ending
cmp byte [rsi], 0
je .return_0 ;string ending
inc rcx
inc rsi
inc rdi
cmp dh, dl
je .next ; the loop continues until the string ends
jl .return_1
jg .retrun_2
.return_0:
mov rax, 0
ret
.return_1:
mov rax, 1
ret
.retrun_2:
mov rax, -1
ret
我正在使用这个简单的 C 代码来运行 NASM:
int main(){
printf("%d\n", my_strncmp("string2", "string1", 3));
}
我的strncmp实际上像普通的strcmp(来自C标准库)一样工作,它只是没有从第8行跳转到
.return_0
标签,上面写着cmp rdx, rcx
。
cmp rdx, rcx
无法工作,因为其余代码修改了RDX寄存器的一部分(mov dh, byte [rdi]
和mov dl, byte [rsi]
都接触了RDX的部分)。jb
和 ja
将它们视为无符号(替换 jl
和 jg
)。my_strncmp:
xor eax, eax ; Remains zero throughout the loop
.Cont: sub rdx, 1
jb .EQ ; Count ran out
movzx ecx, byte [rsi]
cmp [rdi], cl
jb .LT
ja .GT
inc rdi
inc rsi
test cl, cl
jnz .Cont
.EQ: ret ; RAX=0
.LT: dec rax
ret ; RAX=-1
.GT: inc eax
ret ; RAX=1