如何在NASM中实现strncmp

问题描述 投票:0回答:1

我正在尝试在 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

c assembly nasm strcmp strncmp
1个回答
0
投票
  • cmp rdx, rcx
    无法工作,因为其余代码修改了RDX寄存器的一部分(
    mov dh, byte [rdi]
    mov dl, byte [rsi]
    都接触了RDX的部分)。
    您不需要使用 2 个寄存器来实现任务的“最多比较”部分。只需递减第三个参数并在计数结束后返回等于。
  • 不要使用带符号的条件来比较字符。使用
    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
© www.soinside.com 2019 - 2024. All rights reserved.