好吧,标题说明了一切:如果我输入“a”,那么我得到这个“antered string:a”(原文如此!)。我做错了什么,我无法弄清楚发生了什么。
model tiny
.code
org 0100h
start:
mov ax,cs ;set data seg == code seg
mov ds,ax
mov dx,offset tm
mov ah,0ah
int 21h
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: $"
End start
Int 21h/0Ah
将按下的Enter键存储为0Dh
。这对于Int 21h/09h
来说是一个“回车”而且只是一个“回车”。您需要额外的“换行”。您可以将换行符(10h
)添加到tm
字符串的末尾,或者添加另一个Int 21h/09
过程,该过程指向仅包含两个换行符和终止$
(crlf db 0Dh, 0Ah, "$"
)的字符串。
您可以将0Dh
中的tm
更改为'$',而不是添加换行符,以获取“原始”字符串:
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