从8086 emu读取字符串并将其输出回

时间:2019-05-04 17:47:34

标签: assembly emu8086

我正在尝试从我的emu 8086汇编器获取一个字符串作为输入。我想将输入的字符串打印为输出。在打印字符串时,我得到一些有趣的字符作为输出以及输入。

我应该怎么做才能停止输入输入?我试图用$符号终止输入。

DATA SEGMENT
    A DW ?
DATA ENDS    

CODE SEGMENT
   ASSUME CS:CODE,DS:DATA        
 START: 
   MOV AX,DATA
   MOV AH,0AH
   LEA DX,A
   INT 21H 
   LEA DX,A
   MOV AH,9H
   INT 21H
CODE ENDS
END START

2 个答案:

答案 0 :(得分:2)

这里有很多问题。

  • 您忘记设置DS

    mov ax, DATA
    mov ds, ax
    
  • 您不退出程序。

    mov ax, 4C00h       ; DOS.Terminate
    int 21h
    
  • 您没有为DOS.BufferedInput函数0Ah提供正确的输入缓冲区。

    DATA SEGMENT
        A   db   64, 0, 64 dup (0)
    DATA ENDS
    

    我对此DOS函数here

  • 有很好的解释
  • 您不会获取字符串以输出存储其字符的位置,也无法正确地对$进行终止。

    lea dx, A+2
    mov bx, dx
    mov bl, [bx-1]         ; Length of the string
    mov bh, 0
    add bx, dx
    mov byte [bx], "$"     ; Replace 13 by "$"
    mov ah, 09h            ; DOS.DisplayString
    int 21h
    

答案 1 :(得分:0)

您没有正确设置INT 21 / 0A的缓冲区。 DS:DX指向的字节是要读取的最大字节数,下一个字节将保存读取的字节数,然后将从第二个字节开始存储读取的字符串。您将需要类似

的内容
A  DB 20    ; buffer length
   DB 0     ; (return) number of characters read
   DB 20 DUP(?)
   DB '$'   ; extra byte for string termination

最多接受20个字符。在调用INT 21/09之前,您仍然需要添加'$'字符,并且DX中的偏移量应为A + 2(而不是A)。