如何将键盘输入保存到汇编中的寄存器?
How to save keyboard input to a register in assembly?
所以我基本上是在制作一个基本的命令行 os 我已经做到了这样它可以在我按下回车键时按下键盘和一个程序去换行但我希望它存储在移动到新行之前将命令作为字符串,以便我可以将命令与用户输入进行比较,以便我可以让它打印一个字符串或做一些事情所以我们如何加入所有字符并制作一个字符串这里是我的代码直到现在
;bg
MOV AH, 06h
XOR AL, AL
XOR CX, CX
MOV DX, 184FH
MOV BH, 1Eh
INT 10H
;cursor
mov dh, 1
mov dl, 30
mov bh, 0
mov ah, 2
int 10h
;text
mov ah, 0x0E
mov al, 'W'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'E'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'L'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'C'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'O'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'M'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'E'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, ' '
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'T'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'O'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, ' '
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'D'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'A'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'R'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'S'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'H'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'O'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'S'
mov bh, 0x00
int 10h
;cursor
mov dh, 3
mov dl, 2
mov bh, 0
mov ah, 2
int 10h
;commandline
Key:
MOV AH,0
INT 16H
cmp ah, 28
je Newline
mov ah, 0eh
int 10h
jmp Key
Newline:
add dh, 1
mov dl, 2
mov bh, 0
mov ah, 2
int 10h
jmp Key
times 510-($-$$) db 0
dw 0xaa55
截图:
img of the program
作为第一个观察结果,您正在将所有这些写入引导扇区。这对于学习目的可能很好,但至少要注意引导扇区的 512 字节大小限制。我的意思是,您不应该单独输出所有这些字符,而是作为一个字符串输出,这当然是您的问题所在,不是吗。
先解决输出,输入存储问题类似.
使用此代码启动引导扇区程序:
ORG 7C00h
xor ax, ax
mov ds, ax
mov es, ax
cld
在程序底部附近插入以下文本:
msg db 'WELCOME TO DARSHOS', 0
times 510-($-$$) db 0
dw 0xAA55
如果你有很长的单字符输出链,你可以用以下内容替换整个链:
;text
mov si, msg ; Load address of the message in SI
mov bh, 0 ; DisplayPage
lodsb
More:
mov ah, 0Eh ; BIOS.Teletype
int 10h
lodsb ; Retrieve a character, auto-increments the address SI
cmp al, 0
jnz More
如果您的汇编器遵循 NASM 风格,mov si, msg
加载消息的地址。但是如果你的汇编程序遵循 MASM 风格,你将不得不写成 mov si, offset msg
。
为了保存输入的字符,需要定义一个合适的缓冲区。
下面的 buf 行将允许最多 7 个字符的文本命令,后跟定界回车 return。您需要分隔符以便稍后 知道 完整命令的长度。在程序底部附近插入以下行:
buf db '........'
msg db 'WELCOME TO DARSHOS', 0
times 510-($-$$) db 0
dw 0xAA55
这是你填写的方式:
;commandline
Key:
mov di, buf ; Load address of the buffer in DI
Next:
mov ah, 00h ; BIOS.GetKeyboardKey
int 16h ; -> AX
stosb ; Store in buffer, auto-increments the address DI
mov bh, 0 ; DisplayPage
mov ah, 0Eh ; BIOS.Teletype
int 10h
cmp al, 13
jne Next ; Not yet carriage return
mov al, 10 ; Let follow a linefeed to complete the 'newline' sequence
int 10h
...
在 ...
处,您可以开始处理构成命令的字符串,例如 CLS
、TIME
或任何适合您的命令。
所以我基本上是在制作一个基本的命令行 os 我已经做到了这样它可以在我按下回车键时按下键盘和一个程序去换行但我希望它存储在移动到新行之前将命令作为字符串,以便我可以将命令与用户输入进行比较,以便我可以让它打印一个字符串或做一些事情所以我们如何加入所有字符并制作一个字符串这里是我的代码直到现在
;bg
MOV AH, 06h
XOR AL, AL
XOR CX, CX
MOV DX, 184FH
MOV BH, 1Eh
INT 10H
;cursor
mov dh, 1
mov dl, 30
mov bh, 0
mov ah, 2
int 10h
;text
mov ah, 0x0E
mov al, 'W'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'E'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'L'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'C'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'O'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'M'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'E'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, ' '
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'T'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'O'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, ' '
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'D'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'A'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'R'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'S'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'H'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'O'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'S'
mov bh, 0x00
int 10h
;cursor
mov dh, 3
mov dl, 2
mov bh, 0
mov ah, 2
int 10h
;commandline
Key:
MOV AH,0
INT 16H
cmp ah, 28
je Newline
mov ah, 0eh
int 10h
jmp Key
Newline:
add dh, 1
mov dl, 2
mov bh, 0
mov ah, 2
int 10h
jmp Key
times 510-($-$$) db 0
dw 0xaa55
截图: img of the program
作为第一个观察结果,您正在将所有这些写入引导扇区。这对于学习目的可能很好,但至少要注意引导扇区的 512 字节大小限制。我的意思是,您不应该单独输出所有这些字符,而是作为一个字符串输出,这当然是您的问题所在,不是吗。
先解决输出,输入存储问题类似.
使用此代码启动引导扇区程序:
ORG 7C00h
xor ax, ax
mov ds, ax
mov es, ax
cld
在程序底部附近插入以下文本:
msg db 'WELCOME TO DARSHOS', 0
times 510-($-$$) db 0
dw 0xAA55
如果你有很长的单字符输出链,你可以用以下内容替换整个链:
;text
mov si, msg ; Load address of the message in SI
mov bh, 0 ; DisplayPage
lodsb
More:
mov ah, 0Eh ; BIOS.Teletype
int 10h
lodsb ; Retrieve a character, auto-increments the address SI
cmp al, 0
jnz More
如果您的汇编器遵循 NASM 风格,mov si, msg
加载消息的地址。但是如果你的汇编程序遵循 MASM 风格,你将不得不写成 mov si, offset msg
。
为了保存输入的字符,需要定义一个合适的缓冲区。
下面的 buf 行将允许最多 7 个字符的文本命令,后跟定界回车 return。您需要分隔符以便稍后 知道 完整命令的长度。在程序底部附近插入以下行:
buf db '........'
msg db 'WELCOME TO DARSHOS', 0
times 510-($-$$) db 0
dw 0xAA55
这是你填写的方式:
;commandline
Key:
mov di, buf ; Load address of the buffer in DI
Next:
mov ah, 00h ; BIOS.GetKeyboardKey
int 16h ; -> AX
stosb ; Store in buffer, auto-increments the address DI
mov bh, 0 ; DisplayPage
mov ah, 0Eh ; BIOS.Teletype
int 10h
cmp al, 13
jne Next ; Not yet carriage return
mov al, 10 ; Let follow a linefeed to complete the 'newline' sequence
int 10h
...
在 ...
处,您可以开始处理构成命令的字符串,例如 CLS
、TIME
或任何适合您的命令。