Jum*_*man 4 string keyboard assembly input masm
在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
Run Code Online (Sandbox Code Playgroud)
我假设使用0Ah是正确的,因为它是用于读取缓冲字符的输入数组.
Jos*_*uez 10
我对您的代码进行了一些更改.首先,"buff"变量需要三级格式(允许的最大字符数,输入字符数的另一个字节,以及缓冲区本身),因为这是0AH所需的服务.为了使用服务0AH我添加了"偏移buff"(正如沃尔夫冈所说).这里是:
.model small
.stack 100h
.data
buff db 26 ;MAX NUMBER OF CHARACTERS ALLOWED (25).
db ? ;NUMBER OF CHARACTERS ENTERED BY USER.
db 26 dup(0) ;CHARACTERS ENTERED BY USER.
.code
main:
mov ax, @data
mov ds, ax
;CAPTURE STRING FROM KEYBOARD.
mov ah, 0Ah ;SERVICE TO CAPTURE STRING FROM KEYBOARD.
mov dx, offset buff
int 21h
;CHANGE CHR(13) BY '$'.
mov si, offset buff + 1 ;NUMBER OF CHARACTERS ENTERED.
mov cl, [ si ] ;MOVE LENGTH TO CL.
mov ch, 0 ;CLEAR CH TO USE CX.
inc cx ;TO REACH CHR(13).
add si, cx ;NOW SI POINTS TO CHR(13).
mov al, '$'
mov [ si ], al ;REPLACE CHR(13) BY '$'.
;DISPLAY STRING.
mov ah, 9 ;SERVICE TO DISPLAY STRING.
mov dx, offset buff + 2 ;MUST END WITH '$'.
int 21h
mov ah, 4ch
int 21h
end main
Run Code Online (Sandbox Code Playgroud)
当0AH从键盘捕获字符串时,它以ENTER(字符13)结束,这就是为什么,如果要捕获25个字符,则必须指定26.
要知道用户输入的字符数(长度),请访问第二个字节(偏移buff + 1).不包括ENTER,因此,如果用户键入8个字符和ENTER,则第二个字节将包含数字8,而不是9.
输入的字符从偏移buff + 2开始,并在字符13出现时结束.我们用它来增加buff + 2 + 1的长度,用'$'代替chr(13).现在我们可以显示字符串了.
| 归档时间: |
|
| 查看次数: |
39624 次 |
| 最近记录: |