Int 21h/0Ah 将按下的 Enter 键存储为 0Dh。这是针对Int 21h/09h 的“回车”,仅用于“回车”。您需要一个额外的“换行”。您可以将换行符 (10h) 添加到 tm 字符串的末尾,或者添加一个进一步的 Int 21h/09 过程,该过程指向一个仅包含两个换行符和终止 $ 的字符串 (crlf db 0Dh, 0Ah, "$" )。
您可以将 tm 中的 0Dh 更改为 '$' 以获取“原始”字符串,而不是添加换行符:
MODEL tiny
.CODE
.386 ; for `movzx`
ORG 0100h
start:
mov dx, offset tm
mov ah, 0ah
int 21h
mov dx, offset crlf ; Carriage Return & Line Feed & '$'
mov ah, 09h
int 21h
movzx di, byte ptr [tm + 1] ; Length of string w/o the last 0Dh
add di, OFFSET tm + 2 ; Plus start offset of string -> DI points to 0Dh
mov byte ptr [di], '$' ; Change 0Dh to '$'
mov dx,offset testm
mov ah,09h
int 21h
mov dx,offset tm
add dx,2h
mov ah,09h
int 21h
mov dx,offset tm
add dx,2h
mov ah,09h
int 21h
ret
tm db 255,255,255 dup("$")
testm db "Entered string: $"
crlf db 0Dh, 0Ah, "$"
END start
一个优雅的方法是利用WriteFile函数Int21h/40h:
model tiny
.code
org 0100h
start:
mov dx, offset tm
mov ah, 0ah
int 21h
mov dx, offset crlf
mov ah, 09h
int 21h
mov dx, offset testm
mov ah, 09h
int 21h
mov dx, offset tm + 2
xor ch, ch
mov cl, tm + 1 ; Length of tm = number of bytes to write
mov ah, 40h
mov bx, 1 ; Handle 1: StdOut
int 21h ; BX, CX & DX not changed
mov ah, 40h ; Once more.
mov bx, 1
int 21h
ret
tm db 255,255,255 dup("$")
testm db "Entered string: $"
crlf db 0Dh, 0Ah, "$"
End start