2016-10-30 6 views
0

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で、printf functinを使用しています。

多くの時間を費やしましたが、問題は検出されませんでした。もし誰かが私を助けてください検出します。

答えて

2

文字を読むとき、彼らは唯一の8ビット幅なので、唯一の8ビットは、これが言うように、 `al`を使用するか、または、あなたがそれを必要とする他の例のいずれかで、はい

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

値の読み取りと比較します値を64ビット値にゼロ拡張するために 'movzx'を使用してください。 'mov rax、[msg + rcx]は1バイトではなく8バイトを読み込んでいます。 – doug65536

関連する問題