2016-04-19 83 views
1

文字列を文字単位で出力しようとしています。これは私が持っているものである:それは私だけ奇妙な記号を示しているので、私は、文字列の右MEMの参照を取得していた場合、私は知らないTASM文字列の文字を印刷します。

.MODEL SMALL 
.STACK 64 
.DATA 
    string DB 'Something',0 
    len equ $-string 

.CODE 

    xor bx, bx  
    mov si, offset string 
Char: 
    mov al, byte[si + bx] 
    inc bx 
    cmp bx, len 
    je Fin 

    mov ah, 2 
    mov dl, al 
    int 21h 

    jmp Char 

Fin: 
    mov ax, 4c00h 
    int 21h 
END 

。私はdlに30を追加しようとしました、それはアスキー表現のためだと思っていました。

charをcharで印刷するにはどうすればよいですか?

+0

jeの交換.CODE' 'に' .DATA'を変更してみてくださいに1つの以下のジャンプを持っています。 –

+0

@RossRidge試しましたが、まだ変わったシンボル出力を得ています –

+0

あなたのコード 'mov ax、@ data;の先頭に次の2行を入力してください。 mov ds、ax'。私が提案した以前の変更を元に戻す必要があります。 –

答えて

1

ここでは、文字列の始まりをマングリングしていないTasmの実例を示します。

それが原因以降の増分の移動とjnz

.MODEL SMALL 
.STACK 64 
.DATA 
    string DB 'Something' 
    len equ $-string 

.CODE 

Entry: 
    mov ax, @data ;make DS point to our DATA segment 
    mov ds, ax 

    xor bx, bx  ;bx <-- 0 
    mov si, offset string ;address of string to print 

    mov ah, 2  ;we will use repeatedly service #2 of int 21h 

Char: 
    mov dl, [si + bx] ;dl is the char to print 
    int 21h   ;ask DOS to output a single char 

    inc bx   ;point to next char 
    cmp bx, len  
    jnz Char  ;loop if string not finished 

    mov ax, 4c00h 
    int 21h   ;DOS exit program with al = exit code 

END Entry 
+0

'int 21h/ah = 2'は_AL_を破棄するだけなので' Char a'のループの外側で 'mov ah、2'を動かすことができます(最後の文字は_AL_で返されます) 。 –

+1

@MichaelPetch:確かに。私は追加のコメントを付けて、この方法でプログラムを修正しました。 – Seki

+0

問題ありません。私は以前にすぐにそれを見ていました。私はこの夜に再びこのQを見つけたので、これに気づいた。 'mov al、[si + bx]' 'mov dl、al 'は' mov dl、[si + bx] 'に減らすことができます –

関連する問題