尝试输出先前在TASM中连续输入两个字符串

问题描述 投票:1回答:1

好吧,标题说明了一切:如果我输入“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
assembly input output tasm
1个回答
1
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.