【问题标题】:Trying output previously input strings two in a row in TASM尝试在 TASM 中连续输出两个先前输入的字符串
【发布时间】:2015-09-07 06:34:40
【问题描述】:

好吧,标题说明了一切:例如,如果我输入“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】:

    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
    

    【讨论】:

    • 谢谢!它有效,但如果我只想在 tm 和 tm 之间添加空格而不是新行?我想我需要以某种方式修改 crlf db 0Dh, 0Ah, "$"
    • @AbFi:看看我升级后的答案。
    猜你喜欢
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多