Linux 如何从程序集中的字符串中计算字符和行数?

Linux 如何从程序集中的字符串中计算字符和行数?,linux,assembly,x86-64,Linux,Assembly,X86 64,我想编写UNiX/LINUX命令的相应汇编代码wc 此代码仅用于测试 global main extern printf section .data fmt: db "%ld %ld",10,0 msg: db 'CSE DU',10,'Dhaka',10,'Bangladesh',0 ;db 'CSE DU',10,0 section .text main: push rbp mov rcx , 0 ; rcx = number of charect

我想编写UNiX/LINUX命令的相应汇编代码
wc
此代码仅用于测试

global main
extern printf

section .data
fmt:
    db "%ld %ld",10,0
msg:
    db 'CSE DU',10,'Dhaka',10,'Bangladesh',0
    ;db 'CSE DU',10,0
section .text
main:
    push rbp

    mov rcx , 0 ; rcx = number of charecter
    mov rbx , 0 ; rbx = number of line
lp:

    mov rax , [msg+rcx]
    inc rcx
    cmp rax , 0
    je exit ; jump if rax = 0 means EOF ; break
    cmp rax , 10
    jne lp ; jump if rax != 10 means not new line
    inc rbx ; increment rbx if new line found
    jmp lp ; continue

exit:
    dec rcx
    mov rdi , fmt
    mov rsi , rbx
    mov rdx ,rcx
    call printf

    pop rbp
    ret
此代码的结果是
0 23
,但正确的结果是
2 23

如果我使用
msg:db'CSE DU',10,0
(在代码中注释掉),则结果是正确的,结果是
17

我在谷歌上搜索过,但没有找到任何适合我平台的解决方案。 我使用的是Ubuntu(Linux),我的机器是64位的,汇编程序是NASM,使用c printf函数


我花了很多时间,但没有发现问题。如果有人检测到,请帮助我。

读取字符时,字符宽度只有8位,因此只能读取和比较8位值

     mov     al, [msg+rcx]
     inc    rcx
     cmp     al, 0
     je     exit
     cmp     al, 10
     jne    lp
     inc    rbx
     jmp    lp

读取字符时,字符宽度仅为8位,因此仅读取和比较8位值

     mov     al, [msg+rcx]
     inc    rcx
     cmp     al, 0
     je     exit
     cmp     al, 10
     jne    lp
     inc    rbx
     jmp    lp

是的,可以像这样使用
al
,或者在其他需要加宽的情况下,使用
movzx
将值零扩展为64位值。
mov-rax[msg+rcx]
读取的是八个字节,而不是一个字节。是的,可以像这样使用
al
,或者在其他需要加宽的情况下,使用
movzx
将值零扩展到64位值。
mov-rax[msg+rcx]
正在读取八个字节,而不是一个字节。