如何计算汇编中字符串的字符和行?

时间:2016-10-30 17:34:54

标签: assembly

我想编写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(在代码中注释掉),那么结果是正确的,结果是1 7

我在谷歌搜索但没有为我的平台获得任何解决方案。 我正在使用Ubuntu(Linux),我的机器是64位,汇编程序是NASM并使用c printf功能。

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

1 个答案:

答案 0 :(得分:2)

读取字符时,它们只有8位宽,所以只读取并比较8位值

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