将新输入的文本与 asm 中的可用命令列表进行比较
Comparing the freshly inputted text to a list of available commands in asm
如何将 buffer
中的字符串与 '--help'
之类的命令进行比较
你如何将缓冲区中新输入的文本与命令进行比较这里是我的代码
xor ax, ax
mov ds, ax
mov es, ax
cld
;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 si, msg
mov bh, 0
lodsb
More:
mov ah, 0Eh ; BIOS.Teletype
int 10h
lodsb
cmp al, 0
jnz More
;cursor
mov dh, 3
mov dl, 2
mov bh, 0
mov ah, 2
int 10h
;commandline
Key:
mov di, buf
Next:
mov ah, 00h ;GetKeyboardKey
int 16h
stosb
mov bh, 0
mov ah, 0Eh ; BIOS.Teletype
int 10h
cmp al, 13
jne Next
mov al, 10
int 10h
buf db '........'
help db '--help'
msg db 'WELCOME TO DARSHOS', 0
times 510-($-$$) db 0
dw 0xAA55```
help db '--help'
不清楚为什么要在这个命令前加上那些'--'。
对于任务的实用方法,请考虑下一个可用命令列表:
list db 'cls', 13
db 'help', 13
db 'date', 13
db 13
下面是搜索以回车符结尾的 ASCII 字符串列表的一种方法,其中没有字符串具有超过 7 个文本字符加上一个终止字节 (13)。总共 8 个,因为这是我们在输入要查找的命令时选择的限制。
该代码段使用了几个字符串指令:
lodsb
字符串指令将 DS:SI
处的字节加载到 AL
寄存器中。这将自动推进指针。如果方向标志 DF
被清除,它将递增 1。
-
scasb
字符串指令将 AL
寄存器与 ES:DI
处的字节进行比较。这将修改我们可以查询的标志,它也会自动推进指针。
cld
mov si, list
NextItemOnList:
mov di, buf ; Contains the command we want to find (terminated by 13)
NextChar:
lodsb
scasb
jne NotThisOne
cmp al, 13
jne NextChar
Found:
...
NotThisOne:
dec si ; Back to where the mismatch occured
SkipRemainder:
lodsb ; Skip remainder of this list item
cmp al, 13
jne SkipRemainder
cmp byte [si], 13 ; EndOfList ?
jne NextItemOnList ; No
NotFound:
...
通过上面的代码,我们可以查明命令是否在列表中,但它是什么?
- 我们可以选择将索引与列表中的每个命令相关联,例如:
cld
xor cx, cx ; cls=0, help=1, date=2
mov si, list
NextItemOnList:
mov di, buf ; Contains the command we want to find (terminated by 13)
NextChar:
lodsb
scasb
jne NotThisOne
cmp al, 13
jne NextChar
Found:
...
NotThisOne:
dec si ; Back to where the mismatch occured
SkipRemainder:
lodsb ; Skip remainder of this list item
cmp al, 13
jne SkipRemainder
inc cx ; Next index
cmp byte [si], 13 ; EndOfList ?
jne NextItemOnList ; No
NotFound:
...
- 或者我们可以将要处理命令的实际地址添加到列表中,例如:
list dw xCls
db 'cls', 13
dw xHelp
db 'help', 13
dw xDate
db 'date', 13
dw xFail
...
cld
mov si, list
NextItemOnList:
lodsw ; Address of command's execution
mov bx, ax
mov di, buf ; Contains the command we want to find (terminated by 13)
NextChar:
lodsb
scasb
jne NotThisOne
cmp al, 13
jne NextChar
Found:
...
NotThisOne:
dec si ; Back to where the mismatch occured
SkipRemainder:
lodsb ; Skip remainder of this list item
cmp al, 13
jne SkipRemainder
cmp word [si], xFail ; EndOfList ?
jne NextItemOnList ; No
NotFound:
...
如何将 buffer
中的字符串与 '--help'
之类的命令进行比较
你如何将缓冲区中新输入的文本与命令进行比较这里是我的代码
xor ax, ax
mov ds, ax
mov es, ax
cld
;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 si, msg
mov bh, 0
lodsb
More:
mov ah, 0Eh ; BIOS.Teletype
int 10h
lodsb
cmp al, 0
jnz More
;cursor
mov dh, 3
mov dl, 2
mov bh, 0
mov ah, 2
int 10h
;commandline
Key:
mov di, buf
Next:
mov ah, 00h ;GetKeyboardKey
int 16h
stosb
mov bh, 0
mov ah, 0Eh ; BIOS.Teletype
int 10h
cmp al, 13
jne Next
mov al, 10
int 10h
buf db '........'
help db '--help'
msg db 'WELCOME TO DARSHOS', 0
times 510-($-$$) db 0
dw 0xAA55```
help db '--help'
不清楚为什么要在这个命令前加上那些'--'。
对于任务的实用方法,请考虑下一个可用命令列表:
list db 'cls', 13
db 'help', 13
db 'date', 13
db 13
下面是搜索以回车符结尾的 ASCII 字符串列表的一种方法,其中没有字符串具有超过 7 个文本字符加上一个终止字节 (13)。总共 8 个,因为这是我们在输入要查找的命令时选择的限制。
该代码段使用了几个字符串指令:
lodsb
字符串指令将DS:SI
处的字节加载到AL
寄存器中。这将自动推进指针。如果方向标志DF
被清除,它将递增 1。-
scasb
字符串指令将AL
寄存器与ES:DI
处的字节进行比较。这将修改我们可以查询的标志,它也会自动推进指针。
cld
mov si, list
NextItemOnList:
mov di, buf ; Contains the command we want to find (terminated by 13)
NextChar:
lodsb
scasb
jne NotThisOne
cmp al, 13
jne NextChar
Found:
...
NotThisOne:
dec si ; Back to where the mismatch occured
SkipRemainder:
lodsb ; Skip remainder of this list item
cmp al, 13
jne SkipRemainder
cmp byte [si], 13 ; EndOfList ?
jne NextItemOnList ; No
NotFound:
...
通过上面的代码,我们可以查明命令是否在列表中,但它是什么?
- 我们可以选择将索引与列表中的每个命令相关联,例如:
cld
xor cx, cx ; cls=0, help=1, date=2
mov si, list
NextItemOnList:
mov di, buf ; Contains the command we want to find (terminated by 13)
NextChar:
lodsb
scasb
jne NotThisOne
cmp al, 13
jne NextChar
Found:
...
NotThisOne:
dec si ; Back to where the mismatch occured
SkipRemainder:
lodsb ; Skip remainder of this list item
cmp al, 13
jne SkipRemainder
inc cx ; Next index
cmp byte [si], 13 ; EndOfList ?
jne NextItemOnList ; No
NotFound:
...
- 或者我们可以将要处理命令的实际地址添加到列表中,例如:
list dw xCls
db 'cls', 13
dw xHelp
db 'help', 13
dw xDate
db 'date', 13
dw xFail
...
cld
mov si, list
NextItemOnList:
lodsw ; Address of command's execution
mov bx, ax
mov di, buf ; Contains the command we want to find (terminated by 13)
NextChar:
lodsb
scasb
jne NotThisOne
cmp al, 13
jne NextChar
Found:
...
NotThisOne:
dec si ; Back to where the mismatch occured
SkipRemainder:
lodsb ; Skip remainder of this list item
cmp al, 13
jne SkipRemainder
cmp word [si], xFail ; EndOfList ?
jne NextItemOnList ; No
NotFound:
...