📌  相关文章
📜  8086程序检查字符串是否是回文(1)

📅  最后修改于: 2023-12-03 15:29:13.085000             🧑  作者: Mango

检查字符串是否是回文

回文是指正着读和倒着读一模一样的字符串。例如,"level" 和 "racecar" 都是回文字符串。这篇文章将介绍如何使用8086汇编语言编写一个程序来检查给定字符串是否是回文。

设计思路

为了检查一个字符串是否是回文,我们需要比较字符串的第一个字符和最后一个字符,接着比较第二个字符和倒数第二个字符,以此类推。为了完成这个过程,我们可以使用两个指针,一个从字符串的第一个字符开始移动,另一个从字符串的最后一个字符开始移动,并且它们要不断往中间靠拢。

这个算法的实现主要包括以下三个步骤:

  1. 检查字符串的长度,如果长度为奇数,则继续检查;如果长度为偶数,则可以确定字符串不是回文。
  2. 设定两个指针,一个指向字符串的第一个字符,另一个指向字符串的最后一个字符。
  3. 每次比较指针所指的字符,如果它们不相等,则可以确定字符串不是回文;如果它们相等,则继续比较下一个字符,直到两个指针相遇为止。
代码实现

下面是使用8086汇编语言实现检查字符串是否是回文的代码片段:

; 宏定义
%define string_len    BYTE [bp - 2]     ; 字符串长度
%define string_start  BP + 4            ; 字符串起始地址

section .data
 
msg db 'Enter a string: $'
len equ $ - msg

result db ' is a palindrome$'

section .text
global  _start

_start:

    ; 输出提示信息
    mov     ah, 9
    lea     dx, [msg]
    int     21h

    ; 读取输入的字符串
    mov     ah, 0Ah
    lea     dx, [string_start]
    int     21h

    ; 检查字符串是否是回文
    mov     si, string_start        ; si 指向字符串的第一个字符
    mov     di, si                  ; di 指向字符串的最后一个字符
    add     di, string_len - 1

check_palindrome:
    cmp     si, di                  ; 如果 si >= di,说明已经检查完所有字符,则是回文
    jge     palindrome_found

    mov     al, [si]                ; 比较字符串的两个字符
    cmp     al, [di]
    jne     not_palindrome

    ; 如果相等,则继续比较下一对字符
    inc     si
    dec     di
    jmp     check_palindrome

not_palindrome:
    ; 如果发现字符不相等,则输出结果
    mov     ah, 9
    lea     dx, [string_start]
    int     21h
    lea     dx, [result]
    int     21h
    jmp     exit_program

palindrome_found:
    ; 如果字符串是回文,则输出结果
    mov     ah, 9
    lea     dx, [string_start]
    int     21h
    lea     dx, [result + 11]
    int     21h

exit_program:
    ; 退出程序
    mov     ah, 4Ch
    int     21h
代码解释

在这个程序中,我们使用了中断21H来实现向控制台输入和输出字符串的操作。对于输入字符串,我们使用了dos中提供的0Ah中断来读取字符串,这个中断可以在读取到键入回车符(ASCII码为13)时结束。对于输出字符串,我们使用了中断21H中的9号功能码来实现。

程序的主要逻辑在 check_palindrome 标签处,这个标签是一个循环,用来检查字符串是否是回文。其中si和di寄存器分别指向字符串的第一个字符和最后一个字符,每次比较完字符后,我们通过 inc sidec di 来比较下一对字符。如果发现字符不相等,则直接输出结果,结束程序;如果已经检查完所有字符,说明字符串是回文,输出结果并退出程序。