在 emu 8086 中检查没有 INT 21h 的回文字符串

Check string for palindrome without INT 21h in emu 8086

我正在为我的计算机体系结构做作业 class,但我不太了解汇编。我应该从键盘输入一个字符串并检查它是否是回文。我不允许使用 INT 21h。我将程序编写为 db string value 而不是键盘输入,但我仍然无法让我的 CMP 正常工作。我很确定我做错了。希望有人能帮忙。

#make_COM#

include emu8086.inc


org 100h

jmp init       

  msg    db      "kayak",0          

init:
  Mov   SI,5
  mov   di,0
start: 

  mov  al,msg[si]
  dEC si
  inc di 

  mov  ah ,0eh
  int 10h  
  cmp si, -1
  jg start

check:

  mov al, msg[si]
  mov ah, msg[di]
  cmp al, ah
  jmp notpalin
  inc si
  dec di
  cmp si, 5
  jl check

palin:

  call pthis
  db "This is a palindrome", 0
  jmp stop

notpalin:

  call pthis
  db "This is not a palindrome", 0
  jmp stop

stop:
  mov     ah, 0 
  int     16h      ; wait for any key....
  ret ; return to operating system.

DEFINE_PTHIS
  • 您需要从 4 而不是 5 开始 SI 寄存器。使用数字 5 处理您不希望使用 BIOS 电传打字机功能显示的 NULL 字符。

  • 您的程序开始 check 部分将包含 -1 的 SI 寄存器。这显然不是 mov al, msg[si].

  • 的正确内存引用
  • 比较2个字符时,需要使用条件跳转。你使用了一个总是跳跃的跳跃!

    cmp al, ah
    jNE notpalin
    
  • 一旦索引 SIDI 相互交叉,您可以停止检查。

解决方法:

    mov si, 0
    mov di, 4
check:
    mov al, msg[si]
    mov ah, msg[di]
    cmp al, ah
    jne notpalin
    inc si
    dec di
    cmp si, di
    jb  check