Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 从8086 emu读取字符串并将其输出回_Assembly_Emu8086 - Fatal编程技术网

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

Assembly 从8086 emu读取字符串并将其输出回,assembly,emu8086,Assembly,Emu8086,我试图从我的EMU8086汇编程序中获取一个字符串作为输入。我想将输入的字符串打印为输出。在打印字符串时,我得到了一些有趣的字符作为输出,以及我给出的输入 我应该如何停止输入?我已尝试使用$符号终止输入 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

我试图从我的EMU8086汇编程序中获取一个字符串作为输入。我想将输入的字符串打印为输出。在打印字符串时,我得到了一些有趣的字符作为输出,以及我给出的输入

我应该如何停止输入?我已尝试使用
$
符号终止输入

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

您没有正确设置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中的偏移量应该是+2(而不是A)。

这里有很多问题

  • 您忘记设置
    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函数有一个很好的解释

  • 您没有将字符串提取到存储其字符的输出位置,也没有正确地$-终止它

    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
    

可能包括你得到的“有趣角色”的例子。另请参见