【发布时间】:2015-06-12 19:30:39
【问题描述】:
在 MASM 中,我创建了一个缓冲区变量来保存从键盘输入的用户字符串。我被困在如何将字符串输入保存到该缓冲区变量中。我没有像 irvine 那样链接的任何库,并且希望通过 DOS 中断来执行此操作。到目前为止,我有一些类似的东西
.model small
.stack 100h
.data
buff db 25 dup(0), 10, 13
lbuff EQU ($ - buff) ; bytes in a string
.code
main:
mov ax, @data
mov ds, ax
mov ah, 0Ah ; doesn't work
mov buff, ah ; doesn't seem right
int 21h
mov ax, 4000h ; display to screen
mov bx, 1
mov cx, lbuff
mov dx, OFFSET buff
int 21h
mov ah, 4ch
int 21h
end main
我假设使用 0Ah 是正确的,因为它用于读取缓冲字符的输入数组。
【问题讨论】:
-
int 21h/0Ah需要dx中的缓冲区地址。缓冲区中的第一个字节需要是最大输入。通过在其中填充ah,您已经说过您想要十个字符(可能想要更多)。中断返回后,第二个字节为实际输入的字符数。输入文本从缓冲区 + 2 开始。 -
@FrankKotler 好的,所以我通过 mov dx, offset 25 mov ah, 0Ah int 21h 部分让它工作(对不起,我不确定如何在 cmets 中格式化它)。那么输入的字符是从 dx + 2 开始的吗?我如何将它移到我的 buff 变量中?
-
输入函数需要在dx寄存器中缓冲区的开始“mov dx, OFFSET buff”和缓冲区第一个字节的最大输入,例如“mov [buff], ah”十个字符。输出函数需要“mov dx,OFFSET buff+2”和实际输入的字符数“mov cl,[buff+1]”。
-
@DirkWolfgangGlomp 所以应该是
mov dx, OFFSET buff而不是mov dx, OFFSET buff+2,因为字符串开始超过 2 个字节。然后mov cx, lbuff需要变为mov cl, [buff+1],因为这将在字符串移位+2 后为您提供正确的字符串长度,对吗?那么我会在哪里做mov [buff], ah?就在mov ah, 0Ah之前?
标签: string assembly input keyboard masm