Ich schrieb eine Funktion entwickelt, um eine 4 Buchstabenfolge gegen die ersten vier Buchstaben in einem Puffer vergleichen:Vergleicht man Strings in 8086 real-Modus
is_cmd:
; bx is the string address argument
push bx ; Push bx to stack
mov cx, [bx] ; and also move into cx
mov bx, BUFFER ; Reset BUFFER_INDEX
mov [BUFFER_INDEX], bx ; so it points to first 2 characters
mov bx, [BUFFER_INDEX]
cmp cx, [bx] ; Compare
jne is_cmd_no ; Jump if not equal
pop bx ; Retrive bx from stack
inc bx ; Move pointer to next 2 characters
mov cx, [bx] ; Move to cx
mov bx, [BUFFER_INDEX] ; Move BUFFER_INDEX into bx
inc bx ; and move to next 2 characters
cmp cx, [bx] ; Compare
jne is_cmd_no ; Jump if not equal
jmp is_cmd_yes ; Jump if equal both times
is_cmd_no:
mov ax, 1 ; Set ax to 1 so jz will not jump
ret
is_cmd_yes:
mov ax, 0 ; Set ax to 0 so jz will jump
ret
Hier ist ein Beispiel dafür Nutzung ist:
mov bx, REBOOT_CMD
call is_cmd
or ax, ax
jz reboot_cmd
Und hier sind alle Variablen:
REBOOT_CMD:
db "rset",0
BUFFER_INDEX:
dw BUFFER
BUFFER:
times 80 db 0
BUFFER_END:
jedoch, wenn die Zeichenfolge nicht gleich ist es den Emulator verursacht (B OCHS) zu hängen. Warum?
Schauen Sie auf Ihre Pushs und Pops. Nach dem Vergleich hast du gedrängt, aber nicht geplatzt. (Unrelated) 'inc bx' lässt es nicht auf den nächsten Satz von 2 Zeichen zeigen. Sie brauchen 'add bx, 2' hier. – usr2564301
Es gibt keine Notwendigkeit, [buffer_index] zu verwenden, warum vergleichen Sie [bx] nicht einfach mit [Buffer] und [bx + 2] mit [buffer + 2]? – Tommylee2k