2016-12-27 9 views
0

このマイコード。EMU8086でメッセージを動的に印刷する方法

org 100h 

mov cx,5 
loop1: 
     call DISPLAY 
     dec cx 
     cmp cx,0 
     ja loop1 
     jmp Exit 

DISPLAY proc 
MOV AH,09 
MOV DX, offset SCREEN 
INT 21h 
RET 
DISPLAY ENDP   

Exit: 
ret 

SCREEN DB 'Number 1','$' 

このコードでは、「Number1」が5回表示されますが、次のように画面を印刷します。

Number 1 
Number 2 
Number 3 
Number 4 
Number 5 

どうすればよいですか?
ありがとう皆様!!!

+0

「1」のラベルをあなたの文字列とそれを増分します。 – Jester

答えて

2

あなたのメインメッセージと行番号のchar値を連結することができます。これは、printf機能とサポート%d%s(のようなものですより一般的な形式である

:編集

org 100h 

mov cx,5 
loop1: 
     call DISPLAY 
     dec cx 
     cmp cx,0 
     ja loop1 
     jmp Exit 

DISPLAY proc 
MOV AH,09 
MOV BX, offset SCREEN 
MOV AL,CL 
NEG AL 
ADD AL,'0'+6 
MOV [BX+7],AL 
MOV DX,BX 
INT 21h 
RET 
DISPLAY ENDP   

Exit: 
ret 

SCREEN DB 'Number ',0x0A,0x0D,'$' 


このコードは安全でないかもしれませんが):

org 100h 
mov cx,LINES_NUMBER 
xor ax,ax 
loop_main: 
    inc ax 
    mov offset WORD_ARG,ax 
    pusha 
    push offset STR_ARG 
    push offset WORD_ARG 
    mov si,offset TEXT_FORMAT 
    mov di,offset OUT_BUFF 
    call sprintf 
    mov ah,0x09 
    mov dx,offset OUT_BUFF 
    INT 21h 
    popa 
loop loop_main 
ret 
end: 


; sprintf 
; si : Source String 
; di : Destination String 
; You can use %d and %s 
sprintf proc 
    pop cx 
    start_proc:  
     mov ah,[si] 
     cmp ah,'%' 
     je is_arg 
     cmp ah,'$' 
     je exit_proc  
     mov ah,[si] 
     mov [di],ah 
     inc si 
     inc di 
     jmp start_proc 
    is_arg: 
     inc si 
     mov ah,[si] 
     cmp ah,'d' 
     je add_decimal 
     cmp ah,'s' 
     je add_string 
     mov [di],'!' 
     inc di 
     jmp exit_proc 
     jmp start_proc 

    add_decimal: 
     inc si 
     pop bx 
     mov ax,[bx] 
     mov dx,0x8000 
     and dx,ax 
     je not_neg 
     mov [di],'-' 
     inc di 
     neg ax 
    not_neg: 
     push ax 
     mov bx,10 
     push cx 
     xor cx,cx  
    ad_count_digits: 
     xor dx,dx 
     inc cx 
     div bx 
     test ax,ax 
     jne ad_count_digits 
     dec cx 
     mov bx,cx 
     pop cx 
     pop ax 
     xor bh,bh 
     push bx 
     add di,bx 
     mov bx,10 
    ad_print_digits: 
     xor dx,dx 
     div bx 
     add dl,'0' 
     mov [di],dl 
     dec di 
     test ax,ax 
     jne ad_print_digits 
     xor bx,bx 
     pop bx 
     add di,bx 
     add di,2 
     jmp start_proc 
    add_string: 
     inc si 
     pop bx 
    insert_string: 
     mov ah,[bx] 
     mov [di],ah 
     inc bx 
     inc di   
     cmp ah,'$' 
     jne insert_string 
     dec di 
     jmp start_proc  
    exit_proc: 
     mov [di],'$'  
    push cx   
    ret 
sprintf endp 


LINES_NUMBER EQU 5 
WORD_ARG DW 0 
STR_ARG DB 'People.',0x0A,0x0D,'$' 
TEXT_FORMAT DB 'Number %d %s$' 
OUT_BUFF DB 0 DUP(32) 
+0

ありがとうございます@HamidRezaMehrabian、私は最後の質問が1つあります。たとえば、Number 1 PeopleまたはNumber 2 Peopleのように、Number 1の後に他の文字列を追加したい場合。私たちはできますか? – ZpCikTi

+0

@Theory上記の追加 –

関連する問題