【问题标题】:Turbo Assembler Multiple Inputs OverlapTurbo 汇编器多输入重叠
【发布时间】:2018-03-04 22:09:43
【问题描述】:

我是汇编语言的新手,我的代码有问题。起初我尝试了 1 个输入,然后是 1 个输出,它工作得很好。但是当我尝试 2 个输入时。这时候问题就出现了。当它询问“性别”时,输入 1 和输出 1 似乎重叠。

我已经彻底搜索并设法找到一个问同样问题但他/她的问题不同的人,我似乎无法理解。我希望有人能帮帮忙。这是给学校的。

完整代码:

.model small
.stack 200
.data
    message db "Name: ","$"
    message2 db "Your name is: ","$"
    message3 db "Gender: ","$"
    message4 db "Your name is: ","$"
    BUF DB 100  
    DB 100 DUP("$") 

.code
MOV ax,@data
mov ds,ax

LEA dx,message  
mov ah,09h
int 21h
mov ah,0ah ;
mov dx, offset buf
int 21h

LEA dx,message2 
mov ah,09h
int 21h
LEA DX,BUF  
ADD DX,02   
MOV AH,09H
INT 21H

LEA dx,message3 
mov ah,09h
int 21h
mov ah,0ah 
mov dx, offset buf
int 21h


LEA dx,message4 
mov ah,09h
int 21h
LEA DX,BUF  
ADD DX,02   
MOV AH,09H
INT 21H

MOV AX,4C00H
INT 21H
END

【问题讨论】:

  • 打印新行以前进到下一行。
  • 你能说得更具体些吗?

标签: assembly tasm


【解决方案1】:

您应该在每次 AH=0Ah 调用之后显式写入终止字符“$”(或使用单独的缓冲区)。否则,如果您先输入字符串 '123456' 然后输入 'abc',则缓冲区将在下一次先保存 123456\n$$$$$$...abc\n56\n$$$$$

中断 AH=0Ah 会将读取的字符数放在位置 DX + 1。出于某种原因,输入中断使用 '\n' 作为终止字符,而 AH=09h / 打印字符串使用 '$'。

 ;; given dx == offset buf, replace the Carriage Return
 ;; with the terminating character '$'
 fix_end_of_string:
 mov bx, dx
 mov al, [bx + 1]
 mov ah, 0
 add bx, ax
 mov al, '$'
 mov [bx + 2], al
 ret

Some random reference to AH=0Ah / AH=09h services

另一个问题,如其他答案所示,是 DOS 如何将终端管理为具有单独回车和换行的模拟打字机。 CR (0x0d) 仅将“写入头”设置为行首,但不前进到下一行。在 DOS 中,这是通过编写换行符 (ASCII 0x0a) 来完成的,它完全独立于 CR。可以在任何水平位置移动到下一行并继续输入。 当输入一个名称时,显然输入服务 AH=0Ah 将在内部同时输入 CR 和 LF,从而允许在单独的行上打印下一条消息,但输入缓冲区将只有 CR。

【讨论】:

  • 感谢您的回答。我也试试这个。
【解决方案2】:

所有打印都在同一行上完成。为了前进到下一行,您需要打印 \n\r 但当然不是那样,因为它们是由高级语言解释的。您需要使用他们的 ASCII 码:13,10。所以用这个扩展你的代码(.data 部分):

newline db 13,10,"$"

无论你想去哪里换行,只要打印:

 lea dx, newline
 mov ah, 09h
 int 21h

message4 也应该是“你的性别是:”,“$”

【讨论】:

  • 我在 .data 下面添加了 "newline db 13,10,"$" " 但是当我添加 "newline mov,ah,09h" 时似乎出现错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多