Turbo Assembler 在尝试打印新消息时打印之前的消息
Turbo Assembler prints previous message when trying to print new message
我有一个程序可以打印它接收到的一些字符串作为输入。
这是完整的程序:
IDEAL
MODEL small
STACK 100h
DATASEG
; --------------------------
; Your variables here
; --------------------------
const_10 db 10
max_pin_len db 6
pin_len db 0
pin db 6 dup('$')
message_1 db 10, 'Print the text $'
message_2 db 10, 'Print the pin $'
message_3 db 10, 'Encrypt: 0, Decrypt: 1 $'
message_4 db 10, 'result: $'
is_encrypt db ?
newline db 13,10, '$'
maxlen db 100
cur_input_len db 0
buf db 100 dup('$')
CODESEG
start:
mov ax, @data
mov ds, ax
; --------------------------
; Your code here
; --------------------------
lea dx, [message_1]
mov ah, 9
int 21h
mov dl, 10
mov ah, 2
int 21h
input_str:
mov ah, 0Ah
mov dx, offset maxlen
int 21h
call NEW_LINE
lea dx, [buf]
mov ah, 9
int 21h
call NEW_LINE
input_pin:
lea dx, [message_2]
mov ah, 9
int 21h
mov dl, 10
mov ah, 2
int 21h
mov ah, 0Ah
mov dx, offset max_pin_len
int 21h
call NEW_LINE
lea dx, [pin]
mov ah, 9
int 21h
call NEW_LINE
lea di, [buf]
mov cx, 0
mov cl, [cur_input_len] ;the character limit
process:
mov dl, [di]
;print shifted character
add dl, 5
mov ah, 2
int 21h
inc di
loop process
after:
call NEW_LINE
mov dl, [cur_input_len]
add dl, '0'
mov ah, 2
int 21h
exit:
mov ax, 4c00h
int 21h
proc PRINT_AL
; dived by 10 to get two digits
MOV AH,0
DIV [CONST_10] ; al-/ ah=%
;print ASHAROT
MOV DX,AX
ADD DL,'0'
ADD DH,'0'
MOV AH,2
INT 21H
;PRINT YECHIDOT
MOV DL,DH
INT 21H
ret
endp
proc NEW_LINE
lea dx, [newline]
mov ah, 9
int 21h
ret
endp
END start
现在,问题出在输出中。在 input_pin 中,当我调用行
call NEW_LINE
lea dx, [pin]
mov ah, 9
int 21h
call NEW_LINE
它输出:
12345
Print the text
我从来没有要求它在 pin 值之后打印消息。有人可以帮忙吗?
我什至在上面的行之前打印了另一条消息 message_2,它仍然打印消息 1.
好的,从评论中找出答案:
只需确保变量中缓冲区的大小比最大大小高 1。新代码如下所示:
max_pin_len db 6
pin_len db 0
pin db 7 dup('$')
我有一个程序可以打印它接收到的一些字符串作为输入。 这是完整的程序:
IDEAL
MODEL small
STACK 100h
DATASEG
; --------------------------
; Your variables here
; --------------------------
const_10 db 10
max_pin_len db 6
pin_len db 0
pin db 6 dup('$')
message_1 db 10, 'Print the text $'
message_2 db 10, 'Print the pin $'
message_3 db 10, 'Encrypt: 0, Decrypt: 1 $'
message_4 db 10, 'result: $'
is_encrypt db ?
newline db 13,10, '$'
maxlen db 100
cur_input_len db 0
buf db 100 dup('$')
CODESEG
start:
mov ax, @data
mov ds, ax
; --------------------------
; Your code here
; --------------------------
lea dx, [message_1]
mov ah, 9
int 21h
mov dl, 10
mov ah, 2
int 21h
input_str:
mov ah, 0Ah
mov dx, offset maxlen
int 21h
call NEW_LINE
lea dx, [buf]
mov ah, 9
int 21h
call NEW_LINE
input_pin:
lea dx, [message_2]
mov ah, 9
int 21h
mov dl, 10
mov ah, 2
int 21h
mov ah, 0Ah
mov dx, offset max_pin_len
int 21h
call NEW_LINE
lea dx, [pin]
mov ah, 9
int 21h
call NEW_LINE
lea di, [buf]
mov cx, 0
mov cl, [cur_input_len] ;the character limit
process:
mov dl, [di]
;print shifted character
add dl, 5
mov ah, 2
int 21h
inc di
loop process
after:
call NEW_LINE
mov dl, [cur_input_len]
add dl, '0'
mov ah, 2
int 21h
exit:
mov ax, 4c00h
int 21h
proc PRINT_AL
; dived by 10 to get two digits
MOV AH,0
DIV [CONST_10] ; al-/ ah=%
;print ASHAROT
MOV DX,AX
ADD DL,'0'
ADD DH,'0'
MOV AH,2
INT 21H
;PRINT YECHIDOT
MOV DL,DH
INT 21H
ret
endp
proc NEW_LINE
lea dx, [newline]
mov ah, 9
int 21h
ret
endp
END start
现在,问题出在输出中。在 input_pin 中,当我调用行
call NEW_LINE
lea dx, [pin]
mov ah, 9
int 21h
call NEW_LINE
它输出:
12345
Print the text
我从来没有要求它在 pin 值之后打印消息。有人可以帮忙吗? 我什至在上面的行之前打印了另一条消息 message_2,它仍然打印消息 1.
好的,从评论中找出答案: 只需确保变量中缓冲区的大小比最大大小高 1。新代码如下所示:
max_pin_len db 6
pin_len db 0
pin db 7 dup('$')