【问题标题】:Tasm int 21h ah=02h outputs more than one charactertasm int 21h ah=02h 输出多个字符
【发布时间】:2015-09-30 08:05:34
【问题描述】:

我需要得到我的程序成功完成的字符串长度数,但是它也输出没有第一个字母的初始字符串。

.model small
.stack 200h

.data
    nuskaitymoBuferis  db 11

.code
pr1:

mov ax, @data
mov ds, ax

mov dx, offset nuskaitymoBuferis
mov ah, 0Ah
int 21h 
mov nuskaitymoBuferis+11, '$'

mov dl, nuskaitymoBuferis+1
add dl, 30h
mov ah, 02h
int 21h


mov ah, 4ch
mov al, 00h
int 21h

end pr1

例如如果输入是:'test',程序输出:'4est'

【问题讨论】:

    标签: assembly tasm


    【解决方案1】:

    int 21h / ah=02h 输出的字符不超过一个。键入时,字符串“test”会回显到控制台。然后在同一行的开头打印字符“4”,即为“4est”。

    如果您希望“4”出现在新行上,请打印一个换行符。 IE。在打印字符串长度之前,请执行以下操作:

    mov dl,10  ; linefeed
    mov ah,2
    int 21h
    

    您的代码中还有一些其他问题。 nuskaitymoBuferis db 11为 11 个字节保留空间;它为值为 11 的单个字节保留空间。要为 11 个字节保留空间,您可以使用 nuskaitymoBuferis db 11 dup(0)

    即使进行了这种更改,您仍然会在 mov nuskaitymoBuferis+11, '$' 处出现缓冲区溢出,因为您正在尝试写入 11 字节缓冲区的第 12 个字节(请记住偏移量从零开始)。

    【讨论】:

      【解决方案2】:

      在 MSDOS 中,“转到下一行的开头”分两步执行“转到开始列”和“转到下一行”,十六进制:0Dh(回车 = CR),0Ah(换行 = LF) .当您按下 ENTER 按钮时,计算机只会获得一个 CR,该 CR 由INT 21h / AH=0Ah 执行并存储到nuskaitymoBuferis。光标现在位于行首,但不在下一行 - 并且打印了“4”。

      TL;DR... 在INT 21h / AH=0Ah 后面插入换行符:

      ...
      mov dx, offset nuskaitymoBuferis
      mov ah, 0Ah
      int 21h
      mov nuskaitymoBuferis+11, '$'           ; not really good ;-)
      
      mov dl, 0Ah
      mov ah, 02h
      int 21h
      ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-18
        • 2020-01-28
        • 1970-01-01
        • 1970-01-01
        • 2016-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多