将新输入的文本与 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:
  ...