汪生 發表於 2020-3-26 19:51:00

汇编语言之判断回文数

<p><strong>题目描述:</strong></p>
<p><strong>  </strong>打印回文数。如果一个数从左边和从右边读都是相同的数,就称它为回文数,例如383。求出500 以内的回文数并输出显示。要求:提示数据范围为0-500;Enter键,换行显示结果。</p>
<p><strong>基本功能</strong>:</p>
<p>  每输入一个数,都判断是不是回文数(同时伴随着溢出和错误输入判断);若出现溢出或者是错误输入时,程序提示重新输入。</p>
<p><strong>拓展功能:</strong></p>
<p><strong>  </strong>每输入一个1到500的数,若该数是回文数,则输出打印其中0到该数内的所有回文数;若不是回文数,则输出提示不是回文数,并且结束程序。</p>
<p>基本功能代码:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">enterline macro      ;定义回车换行的宏指令
    mov dl,</span><span style="color: rgba(128, 0, 128, 1)">13</span><span style="color: rgba(0, 0, 0, 1)">
    mov ah,</span><span style="color: rgba(128, 0, 128, 1)">2</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
    mov dl,</span><span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">
    mov ah,</span><span style="color: rgba(128, 0, 128, 1)">2</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
endm

DATAS SEGMENT
    input db </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Please input a number between 0 and 500:$</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
    output1 db </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Convertion Success!$</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
    err db </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Illegal input! Please Try Again$</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
    out1 db </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Sorry, the number you entered is more than 500, please try again$</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
    buf db </span><span style="color: rgba(128, 0, 128, 1)">10</span>,?,<span style="color: rgba(128, 0, 128, 1)">10</span> dup(<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)    ;定义键盘接收字符缓冲区,最多接收9个字符
    len dw </span>?<span style="color: rgba(0, 0, 0, 1)">      ;记录输入的数的长度
    nop1 db </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">The number you entered is not palindrome, bye$</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
    sum dw </span>?<span style="color: rgba(0, 0, 0, 1)">
    space db </span><span style="color: rgba(128, 0, 0, 1)">'</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">    ;空格
    flag db </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
   
   
    test1 db </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">333$</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
    ;此处输入数据段代码
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
   
begin:
    lea dx,input    ;给出输入提示
    mov ah,</span><span style="color: rgba(128, 0, 128, 1)">9</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
    enterline      ;回车换行
   
    lea dx,buf      ;从键盘接收输入数值放入buf缓冲区(输入操作)
    mov ah,</span><span style="color: rgba(128, 0, 128, 1)">10</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
    enterline      ;回车换行
      
       push bx            ;入栈保护
       push cx
       push dx
       push si               
       call ascii_num
       pop si            ;退栈
       pop dx
       pop cx
       pop bx

;接下来是回文数的检测考虑直接对字符进行回文数的检测
   
    jmp judge            ;判断输入的数长度,结果存在cx中,si存入检测的数

judgeovr:
   
    cmp flag,</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">            ;标志是否为输出的那个数
    je firstjudge
   

firstjudge:   
    mov flag,</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
    mov si,</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">      
   
    cmp cx,</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
    je loop_num
   
   
    cmp cx,</span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">
    je len2
   
    cmp cx,</span><span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">
    je len3
   
   

len2:

lea dx,test1
    mov ah,</span><span style="color: rgba(128, 0, 128, 1)">9</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
    enterline

   
    xor ax,ax
    xor dx,dx
    mov ax,sum
    mov bx,</span><span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">
    div bx
   cmp ax,dx
   je loop_num
   
   jmp not1      ;判断出该数不是回文数
   
len3:
   
    xor ax,ax
    xor dx,dx
    xor di,di
    mov ax,sum
    mov bx,</span><span style="color: rgba(128, 0, 128, 1)">100</span><span style="color: rgba(0, 0, 0, 1)">
    div bx
   mov di,ax
   mov ax,dx
   xor dx,dx
   mov bx,</span><span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">
   div bx
   cmp di,dx
   je loop_num   
   
   jmp not1      ;判断出该数不是回文数

   
loop_num:
    lea dx,output1
    mov ah,</span><span style="color: rgba(128, 0, 128, 1)">9</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
    jmp stop


num_ascii:
    mov ax,si;(有效数值为0</span>~<span style="color: rgba(128, 0, 128, 1)">65535</span><span style="color: rgba(0, 0, 0, 1)">)待转换数放置于AX寄存器中
    mov bx,</span><span style="color: rgba(128, 0, 128, 1)">100</span><span style="color: rgba(0, 0, 0, 1)">            ;初始数位权值为100
   
cov1:xor dx,dx            ;将dx:ax中的数值除以权值
    div bx
    mov cx,dx            ;余数备份到CX寄存器中
   
    cmp flag,</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">            ;检测是否曾遇到非0商值
    jne nor1            ;如遇到过,则不管商是否为0都输出显示
    cmp ax,</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">            ;如未遇到过,则检测商是否为0
    je cont                ;为0则不输出显示
   
nor1:
    mov dl,al            ;将商转换为ascii码输出显示
    add dl,30h
    mov ah,</span><span style="color: rgba(128, 0, 128, 1)">2</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
   
    mov flag,</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">            ;曾遇到非0商,则将标志置1
   
cont:
    cmp bx,</span><span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">            ;检测权值是否已经修改到十位了
    je outer            ;如果相等,则完成最后的个位数输出显示
   
    xor dx,dx            ;将数位权值除以10
    mov ax,bx
    mov bx,</span><span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">
    div bx
    mov bx,ax
   
    mov ax,cx            ;将备份的余数送入AX
    jmp cov1                ;继续循环
   
outer:
    mov dl,cl            ;最后的个位数变为ascii码输出显示
    add dl,30h
    mov ah,</span><span style="color: rgba(128, 0, 128, 1)">2</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h   
   
    mov dl,space
    mov ah,</span><span style="color: rgba(128, 0, 128, 1)">2</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
   
    jmp loop_num

   
not1:                ;不是回文数
    lea dx,nop1
    mov ah,</span><span style="color: rgba(128, 0, 128, 1)">9</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
    enterline
   
    jmp stop         ;如出错则返回起始点重新输入
   
error:                ;给出错误提示(输入不规范)
    lea dx,err
    mov ah,</span><span style="color: rgba(128, 0, 128, 1)">9</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
    enterline
   
    jmp begin         ;如出错则返回起始点重新输入

yichu:                ;超过500范围的提示
    lea dx,out1
    mov ah,</span><span style="color: rgba(128, 0, 128, 1)">9</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
    enterline
   
    jmp begin         ;如出错则返回起始点重新输入
   
judge:

    xor ax,ax
    xor dx,dx
    xor bx,bx
    xor cx,cx
   
    mov si,sum
    mov cx,</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">            ;最初长度赋值为1
   
   
    mov ax,si            ;将检测的数赋值给ax
    mov bx,</span><span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">            ;除数赋值10
    div bx
    cmp ax,</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">            ;相等就跳走
    je judgeovr
   
    mov cx,</span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">
    xor dx,dx
    mov ax,si            ;将检测的数赋值给ax
    mov bx,</span><span style="color: rgba(128, 0, 128, 1)">100</span><span style="color: rgba(0, 0, 0, 1)">            ;除数赋值10
    div bx
   
    cmp ax,</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
    je judgeovr
   
   
    mov cx,</span><span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">
    jmp judgeovr
   
   
stop:
    MOV AH,4CH
    INT 21H


ascii_num PROC      ;将字符串转成数字的子程序

    mov cl,buf</span>+<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">    ;获取实际键入字符数,置于CX寄存器中
    xor ch,ch      ;ch清0
    mov len,cx      ;这里把长度保存下来方便后面使用
   
    xor di,di      ;累加器清0
    xor dx,dx      ;dX寄存器清0
    mov bx,</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">      ;由于从个位数开始算起,因而将所乘权值设为1
   
    lea si,buf</span>+<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">    ;将si指向接收到的第1个字符位置
    add si,cx      ;因为从个位算起,所以将si指向最后1个接收到的个位数
    dec si            ;往回减1使其指向字串最后一个元素

cov:mov al,      ;取出个位数给al
    cmp al,</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">'</span>      ;边界检查:如果输入不是0-<span style="color: rgba(0, 0, 0, 1)">9的数字,就报错
    jb error
    cmp al,</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">9</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
    ja error

    sub al,30h      ;将al中的ascii码转为数字
    xor ah,ah
    mul bx            ;乘以所处数位的权值
    cmp dx,</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">      ;判断结果是否超出16位数范围,如超出则报错
    jne error
   
    add di,ax      ;将形成的数值放在累加器di中
    jc error      ;如数值超过16位数范围报错
   
    cmp di,</span><span style="color: rgba(128, 0, 128, 1)">500</span><span style="color: rgba(0, 0, 0, 1)">
    ja yichu
    mov sum,di
   
      
    mov ax,bx      ;将BX中的数位权值乘以10
    mov bx,</span><span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">
    mul bx
    mov bx,ax
   
    dec si            ;si指针减1,指向前一数位
    loop cov      ;按CX中的字符个数计数循环
   
       mov ax,di      ;将最终转换结果从di中放置到ax中
EXIT:
    RET
ascii_num ENDP


CODES ENDS
    END START</span></pre>
</div>
<p>拓展功能代码:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">enterline macro      ;定义回车换行的宏指令
</span><span style="color: rgba(0, 128, 128, 1)">2</span>   mov dl,<span style="color: rgba(128, 0, 128, 1)">13</span>
<span style="color: rgba(0, 128, 128, 1)">3</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">4</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)">5</span>   mov dl,<span style="color: rgba(128, 0, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">6</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">7</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)">8</span> <span style="color: rgba(0, 0, 0, 1)">endm
</span><span style="color: rgba(0, 128, 128, 1)">9</span>
<span style="color: rgba(0, 128, 128, 1)"> 10</span> <span style="color: rgba(0, 0, 0, 1)">DATAS SEGMENT
</span><span style="color: rgba(0, 128, 128, 1)"> 11</span>   input db <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Please input a number between 0 and 500:$</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 12</span>   err db <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Illegal input! Please Try Again$</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 13</span>   out1 db <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Sorry, the number you entered is more than 500, please try again$</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 14</span>   buf db <span style="color: rgba(128, 0, 128, 1)">10</span>,?,<span style="color: rgba(128, 0, 128, 1)">10</span> dup(<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)    ;定义键盘接收字符缓冲区,最多接收9个字符
</span><span style="color: rgba(0, 128, 128, 1)"> 15</span>   
<span style="color: rgba(0, 128, 128, 1)"> 16</span>   nop1 db <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">The number you entered is not palindrome, bye$</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 17</span>   sum dw ?
<span style="color: rgba(0, 128, 128, 1)"> 18</span>   space db <span style="color: rgba(128, 0, 0, 1)">'</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">    ;空格
</span><span style="color: rgba(0, 128, 128, 1)"> 19</span>   flag db <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">            ;用于不输出前导0的标志
</span><span style="color: rgba(0, 128, 128, 1)"> 20</span>   ff db <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">                ;用于标记是否为第一次回文数判断
</span><span style="color: rgba(0, 128, 128, 1)"> 21</span>   zero db <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">            ;标志0是否输出过
</span><span style="color: rgba(0, 128, 128, 1)"> 22</span>   
<span style="color: rgba(0, 128, 128, 1)"> 23</span> <span style="color: rgba(0, 0, 0, 1)">    ;此处输入数据段代码
</span><span style="color: rgba(0, 128, 128, 1)"> 24</span> <span style="color: rgba(0, 0, 0, 1)">DATAS ENDS
</span><span style="color: rgba(0, 128, 128, 1)"> 25</span>
<span style="color: rgba(0, 128, 128, 1)"> 26</span> <span style="color: rgba(0, 0, 0, 1)">STACKS SEGMENT
</span><span style="color: rgba(0, 128, 128, 1)"> 27</span> <span style="color: rgba(0, 0, 0, 1)">    ;此处输入堆栈段代码
</span><span style="color: rgba(0, 128, 128, 1)"> 28</span> <span style="color: rgba(0, 0, 0, 1)">STACKS ENDS
</span><span style="color: rgba(0, 128, 128, 1)"> 29</span>
<span style="color: rgba(0, 128, 128, 1)"> 30</span> <span style="color: rgba(0, 0, 0, 1)">CODES SEGMENT
</span><span style="color: rgba(0, 128, 128, 1)"> 31</span> <span style="color: rgba(0, 0, 0, 1)">    ASSUME CS:CODES,DS:DATAS,SS:STACKS
</span><span style="color: rgba(0, 128, 128, 1)"> 32</span> <span style="color: rgba(0, 0, 0, 1)">START:
</span><span style="color: rgba(0, 128, 128, 1)"> 33</span> <span style="color: rgba(0, 0, 0, 1)">    MOV AX,DATAS
</span><span style="color: rgba(0, 128, 128, 1)"> 34</span> <span style="color: rgba(0, 0, 0, 1)">    MOV DS,AX
</span><span style="color: rgba(0, 128, 128, 1)"> 35</span> <span style="color: rgba(0, 0, 0, 1)">    ;此处输入代码段代码
</span><span style="color: rgba(0, 128, 128, 1)"> 36</span>   
<span style="color: rgba(0, 128, 128, 1)"> 37</span> <span style="color: rgba(0, 0, 0, 1)">begin:
</span><span style="color: rgba(0, 128, 128, 1)"> 38</span> <span style="color: rgba(0, 0, 0, 1)">    lea dx,input    ;给出输入提示
</span><span style="color: rgba(0, 128, 128, 1)"> 39</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
<span style="color: rgba(0, 128, 128, 1)"> 40</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)"> 41</span> <span style="color: rgba(0, 0, 0, 1)">    enterline      ;回车换行
</span><span style="color: rgba(0, 128, 128, 1)"> 42</span>   
<span style="color: rgba(0, 128, 128, 1)"> 43</span> <span style="color: rgba(0, 0, 0, 1)">    lea dx,buf      ;从键盘接收输入数值放入buf缓冲区(输入操作)
</span><span style="color: rgba(0, 128, 128, 1)"> 44</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)"> 45</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)"> 46</span> <span style="color: rgba(0, 0, 0, 1)">    enterline      ;回车换行
</span><span style="color: rgba(0, 128, 128, 1)"> 47</span>      
<span style="color: rgba(0, 128, 128, 1)"> 48</span> <span style="color: rgba(0, 0, 0, 1)">       push bx            ;入栈保护
</span><span style="color: rgba(0, 128, 128, 1)"> 49</span> <span style="color: rgba(0, 0, 0, 1)">       push cx
</span><span style="color: rgba(0, 128, 128, 1)"> 50</span> <span style="color: rgba(0, 0, 0, 1)">       push dx
</span><span style="color: rgba(0, 128, 128, 1)"> 51</span> <span style="color: rgba(0, 0, 0, 1)">       push si               
</span><span style="color: rgba(0, 128, 128, 1)"> 52</span> <span style="color: rgba(0, 0, 0, 1)">       call ascii_num    ;调用子程序输入数据
</span><span style="color: rgba(0, 128, 128, 1)"> 53</span> <span style="color: rgba(0, 0, 0, 1)">       pop si            ;退栈
</span><span style="color: rgba(0, 128, 128, 1)"> 54</span> <span style="color: rgba(0, 0, 0, 1)">       pop dx
</span><span style="color: rgba(0, 128, 128, 1)"> 55</span> <span style="color: rgba(0, 0, 0, 1)">       pop cx
</span><span style="color: rgba(0, 128, 128, 1)"> 56</span> <span style="color: rgba(0, 0, 0, 1)">       pop bx
</span><span style="color: rgba(0, 128, 128, 1)"> 57</span>
<span style="color: rgba(0, 128, 128, 1)"> 58</span> <span style="color: rgba(0, 0, 0, 1)">    mov si,sum            ;将输入的数的值先复制给si
</span><span style="color: rgba(0, 128, 128, 1)"> 59</span> <span style="color: rgba(0, 0, 0, 1)">    call judge            ;判断输入的数长度,结果存在cx中,si是待检测的数
</span><span style="color: rgba(0, 128, 128, 1)"> 60</span>   
<span style="color: rgba(0, 128, 128, 1)"> 61</span>   
<span style="color: rgba(0, 128, 128, 1)"> 62</span> <span style="color: rgba(0, 0, 0, 1)">judgeovr:                ;第二次及以后的回文数判断
</span><span style="color: rgba(0, 128, 128, 1)"> 63</span>   cmp ff,<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">            ;标志是否为输出的那个数
</span><span style="color: rgba(0, 128, 128, 1)"> 64</span> <span style="color: rgba(0, 0, 0, 1)">    je firstjudge
</span><span style="color: rgba(0, 128, 128, 1)"> 65</span>   
<span style="color: rgba(0, 128, 128, 1)"> 66</span>   cmp cx,<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">            ;数只有一位时直接输出
</span><span style="color: rgba(0, 128, 128, 1)"> 67</span> <span style="color: rgba(0, 0, 0, 1)">    je num_ascii         
</span><span style="color: rgba(0, 128, 128, 1)"> 68</span>   cmp cx,<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">            ;数有两位时跳转到两位数的回文判断
</span><span style="color: rgba(0, 128, 128, 1)"> 69</span> <span style="color: rgba(0, 0, 0, 1)">    je len22
</span><span style="color: rgba(0, 128, 128, 1)"> 70</span>   cmp cx,<span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">            ;数有三位时跳转到三位数的回文判断
</span><span style="color: rgba(0, 128, 128, 1)"> 71</span> <span style="color: rgba(0, 0, 0, 1)">    je len33
</span><span style="color: rgba(0, 128, 128, 1)"> 72</span>
<span style="color: rgba(0, 128, 128, 1)"> 73</span> <span style="color: rgba(0, 0, 0, 1)">len22:                  ;两位数的回文判断,判断个位十位是否相同
</span><span style="color: rgba(0, 128, 128, 1)"> 74</span> <span style="color: rgba(0, 0, 0, 1)">    xor ax,ax
</span><span style="color: rgba(0, 128, 128, 1)"> 75</span> <span style="color: rgba(0, 0, 0, 1)">    xor dx,dx
</span><span style="color: rgba(0, 128, 128, 1)"> 76</span> <span style="color: rgba(0, 0, 0, 1)">    mov ax,si
</span><span style="color: rgba(0, 128, 128, 1)"> 77</span>   mov bx,<span style="color: rgba(128, 0, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)"> 78</span> <span style="color: rgba(0, 0, 0, 1)">    div bx
</span><span style="color: rgba(0, 128, 128, 1)"> 79</span> <span style="color: rgba(0, 0, 0, 1)">   cmp ax,dx
</span><span style="color: rgba(0, 128, 128, 1)"> 80</span> <span style="color: rgba(0, 0, 0, 1)">   je num_ascii
</span><span style="color: rgba(0, 128, 128, 1)"> 81</span>      
<span style="color: rgba(0, 128, 128, 1)"> 82</span> <span style="color: rgba(0, 0, 0, 1)">   jmp loop_num      ;判断出该数不是回文数,跳回loop_num去取下一个数
</span><span style="color: rgba(0, 128, 128, 1)"> 83</span>   
<span style="color: rgba(0, 128, 128, 1)"> 84</span> <span style="color: rgba(0, 0, 0, 1)">len33:                  ;三位数的回文判断,判断百位个位是否相同
</span><span style="color: rgba(0, 128, 128, 1)"> 85</span> <span style="color: rgba(0, 0, 0, 1)">    xor ax,ax
</span><span style="color: rgba(0, 128, 128, 1)"> 86</span> <span style="color: rgba(0, 0, 0, 1)">    xor dx,dx
</span><span style="color: rgba(0, 128, 128, 1)"> 87</span> <span style="color: rgba(0, 0, 0, 1)">    xor di,di
</span><span style="color: rgba(0, 128, 128, 1)"> 88</span> <span style="color: rgba(0, 0, 0, 1)">    mov ax,si
</span><span style="color: rgba(0, 128, 128, 1)"> 89</span>   mov bx,<span style="color: rgba(128, 0, 128, 1)">100</span>
<span style="color: rgba(0, 128, 128, 1)"> 90</span> <span style="color: rgba(0, 0, 0, 1)">    div bx
</span><span style="color: rgba(0, 128, 128, 1)"> 91</span> <span style="color: rgba(0, 0, 0, 1)">   mov di,ax
</span><span style="color: rgba(0, 128, 128, 1)"> 92</span> <span style="color: rgba(0, 0, 0, 1)">   mov ax,dx
</span><span style="color: rgba(0, 128, 128, 1)"> 93</span> <span style="color: rgba(0, 0, 0, 1)">   xor dx,dx
</span><span style="color: rgba(0, 128, 128, 1)"> 94</span>      mov bx,<span style="color: rgba(128, 0, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)"> 95</span> <span style="color: rgba(0, 0, 0, 1)">   div bx
</span><span style="color: rgba(0, 128, 128, 1)"> 96</span> <span style="color: rgba(0, 0, 0, 1)">   cmp di,dx
</span><span style="color: rgba(0, 128, 128, 1)"> 97</span> <span style="color: rgba(0, 0, 0, 1)">   je num_ascii
</span><span style="color: rgba(0, 128, 128, 1)"> 98</span>      
<span style="color: rgba(0, 128, 128, 1)"> 99</span> <span style="color: rgba(0, 0, 0, 1)">   jmp loop_num      ;判断出该数不是回文数,跳回loop_num去取下一个数
</span><span style="color: rgba(0, 128, 128, 1)">100</span>
<span style="color: rgba(0, 128, 128, 1)">101</span>
<span style="color: rgba(0, 128, 128, 1)">102</span> <span style="color: rgba(0, 0, 0, 1)">firstjudge:                ;对输入的数进行第一次的回文判断
</span><span style="color: rgba(0, 128, 128, 1)">103</span>   mov ff,<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 128, 128, 1)">104</span>   mov si,<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">            ;si从0开始,方便后面inc
</span><span style="color: rgba(0, 128, 128, 1)">105</span>   
<span style="color: rgba(0, 128, 128, 1)">106</span>   cmp cx,<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">            ;数只有一位时直接跳转去循环,代表输入的数是回文数            
</span><span style="color: rgba(0, 128, 128, 1)">107</span> <span style="color: rgba(0, 0, 0, 1)">    je loop_num                                          
</span><span style="color: rgba(0, 128, 128, 1)">108</span>   cmp cx,<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">            ;数有两位时跳转到两位数的回文判断
</span><span style="color: rgba(0, 128, 128, 1)">109</span> <span style="color: rgba(0, 0, 0, 1)">    je len2                                             
</span><span style="color: rgba(0, 128, 128, 1)">110</span>   cmp cx,<span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">            ;数有三位时跳转到三位数的回文判断
</span><span style="color: rgba(0, 128, 128, 1)">111</span> <span style="color: rgba(0, 0, 0, 1)">    je len3   
</span><span style="color: rgba(0, 128, 128, 1)">112</span>
<span style="color: rgba(0, 128, 128, 1)">113</span> <span style="color: rgba(0, 0, 0, 1)">len2:                  ;两位数的回文判断,判断个位十位是否相同
</span><span style="color: rgba(0, 128, 128, 1)">114</span> <span style="color: rgba(0, 0, 0, 1)">    xor ax,ax
</span><span style="color: rgba(0, 128, 128, 1)">115</span> <span style="color: rgba(0, 0, 0, 1)">    xor dx,dx
</span><span style="color: rgba(0, 128, 128, 1)">116</span> <span style="color: rgba(0, 0, 0, 1)">    mov ax,sum            ;将输入的值赋给ax去判断
</span><span style="color: rgba(0, 128, 128, 1)">117</span>   mov bx,<span style="color: rgba(128, 0, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">118</span> <span style="color: rgba(0, 0, 0, 1)">    div bx
</span><span style="color: rgba(0, 128, 128, 1)">119</span> <span style="color: rgba(0, 0, 0, 1)">   cmp ax,dx
</span><span style="color: rgba(0, 128, 128, 1)">120</span> <span style="color: rgba(0, 0, 0, 1)">   je loop_num            ;判断该数是回文数,跳转循环
</span><span style="color: rgba(0, 128, 128, 1)">121</span>      
<span style="color: rgba(0, 128, 128, 1)">122</span> <span style="color: rgba(0, 0, 0, 1)">   jmp not1            ;判断出该数不是回文数,跳转notq
</span><span style="color: rgba(0, 128, 128, 1)">123</span>      
<span style="color: rgba(0, 128, 128, 1)">124</span> <span style="color: rgba(0, 0, 0, 1)">len3:                  ;三位数的回文判断,判断百位各位是否相同
</span><span style="color: rgba(0, 128, 128, 1)">125</span> <span style="color: rgba(0, 0, 0, 1)">    xor ax,ax
</span><span style="color: rgba(0, 128, 128, 1)">126</span> <span style="color: rgba(0, 0, 0, 1)">    xor dx,dx
</span><span style="color: rgba(0, 128, 128, 1)">127</span> <span style="color: rgba(0, 0, 0, 1)">    xor di,di
</span><span style="color: rgba(0, 128, 128, 1)">128</span> <span style="color: rgba(0, 0, 0, 1)">    mov ax,sum            ;将输入的值赋给ax去判断
</span><span style="color: rgba(0, 128, 128, 1)">129</span>   mov bx,<span style="color: rgba(128, 0, 128, 1)">100</span>
<span style="color: rgba(0, 128, 128, 1)">130</span> <span style="color: rgba(0, 0, 0, 1)">    div bx
</span><span style="color: rgba(0, 128, 128, 1)">131</span> <span style="color: rgba(0, 0, 0, 1)">   mov di,ax
</span><span style="color: rgba(0, 128, 128, 1)">132</span> <span style="color: rgba(0, 0, 0, 1)">   mov ax,dx
</span><span style="color: rgba(0, 128, 128, 1)">133</span> <span style="color: rgba(0, 0, 0, 1)">   xor dx,dx
</span><span style="color: rgba(0, 128, 128, 1)">134</span>      mov bx,<span style="color: rgba(128, 0, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">135</span> <span style="color: rgba(0, 0, 0, 1)">   div bx
</span><span style="color: rgba(0, 128, 128, 1)">136</span> <span style="color: rgba(0, 0, 0, 1)">   cmp di,dx
</span><span style="color: rgba(0, 128, 128, 1)">137</span> <span style="color: rgba(0, 0, 0, 1)">   je loop_num            ;判断该数是回文数,跳转循环
</span><span style="color: rgba(0, 128, 128, 1)">138</span>      
<span style="color: rgba(0, 128, 128, 1)">139</span> <span style="color: rgba(0, 0, 0, 1)">   jmp not1            ;判断出该数不是回文数,跳转not1
</span><span style="color: rgba(0, 128, 128, 1)">140</span>
<span style="color: rgba(0, 128, 128, 1)">141</span>   
<span style="color: rgba(0, 128, 128, 1)">142</span> <span style="color: rgba(0, 0, 0, 1)">loop_num:                ;循环:代表输入的数已经是回文数,接下来循环从0—输入的数的回文数打印
</span><span style="color: rgba(0, 128, 128, 1)">143</span>   
<span style="color: rgba(0, 128, 128, 1)">144</span> <span style="color: rgba(0, 0, 0, 1)">    inc si                ;每次都去判断,si的变化范围是0—输入的数,每次加1
</span><span style="color: rgba(0, 128, 128, 1)">145</span> <span style="color: rgba(0, 0, 0, 1)">    cmp si,sum            ;当大于输入的数时跳转停止
</span><span style="color: rgba(0, 128, 128, 1)">146</span> <span style="color: rgba(0, 0, 0, 1)">    ja stop
</span><span style="color: rgba(0, 128, 128, 1)">147</span>   
<span style="color: rgba(0, 128, 128, 1)">148</span> <span style="color: rgba(0, 0, 0, 1)">    call judge            ;每次si加1后,都要去判断si的长度,其中cx中存长度
</span><span style="color: rgba(0, 128, 128, 1)">149</span> <span style="color: rgba(0, 0, 0, 1)">                        ;judge判断完长度后,会自动跳转判断回文数和打印数
</span><span style="color: rgba(0, 128, 128, 1)">150</span>   
<span style="color: rgba(0, 128, 128, 1)">151</span> <span style="color: rgba(0, 0, 0, 1)">    jmp loop_num      ;不断循环
</span><span style="color: rgba(0, 128, 128, 1)">152</span>   
<span style="color: rgba(0, 128, 128, 1)">153</span> <span style="color: rgba(0, 0, 0, 1)">zz:                        ;该段程序是解决输出0的问题
</span><span style="color: rgba(0, 128, 128, 1)">154</span>   mov zero,<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">            ;0输出过
</span><span style="color: rgba(0, 128, 128, 1)">155</span>   
<span style="color: rgba(0, 128, 128, 1)">156</span>   mov dl,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">157</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">158</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)">159</span>         
<span style="color: rgba(0, 128, 128, 1)">160</span> <span style="color: rgba(0, 0, 0, 1)">    mov dl,space      ;输出空格
</span><span style="color: rgba(0, 128, 128, 1)">161</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">162</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)">163</span>   
<span style="color: rgba(0, 128, 128, 1)">164</span> <span style="color: rgba(0, 0, 0, 1)">    jmp num_ascii      ;输完0后再开始从1开始输出
</span><span style="color: rgba(0, 128, 128, 1)">165</span>
<span style="color: rgba(0, 128, 128, 1)">166</span> <span style="color: rgba(0, 0, 0, 1)">num_ascii:                ;将num转为ascii
</span><span style="color: rgba(0, 128, 128, 1)">167</span>   cmp zero,<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">            ;判断0是否输出过,没输出就去输出0
</span><span style="color: rgba(0, 128, 128, 1)">168</span> <span style="color: rgba(0, 0, 0, 1)">    je zz
</span><span style="color: rgba(0, 128, 128, 1)">169</span>
<span style="color: rgba(0, 128, 128, 1)">170</span> <span style="color: rgba(0, 0, 0, 1)">    mov ax,si            ;将每次循环计数的si赋值ax去输出
</span><span style="color: rgba(0, 128, 128, 1)">171</span>   mov bx,<span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">            ;初始数位权值为10
</span><span style="color: rgba(0, 128, 128, 1)">172</span>   cmp cx,<span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">            ;若为3位数,则赋权为100
</span><span style="color: rgba(0, 128, 128, 1)">173</span> <span style="color: rgba(0, 0, 0, 1)">    je cx_3
</span><span style="color: rgba(0, 128, 128, 1)">174</span>   
<span style="color: rgba(0, 128, 128, 1)">175</span> <span style="color: rgba(0, 0, 0, 1)">cov1:xor dx,dx            ;将dx:ax中的数值除以权值
</span><span style="color: rgba(0, 128, 128, 1)">176</span> <span style="color: rgba(0, 0, 0, 1)">    div bx
</span><span style="color: rgba(0, 128, 128, 1)">177</span> <span style="color: rgba(0, 0, 0, 1)">    mov cx,dx            ;余数备份到CX寄存器中
</span><span style="color: rgba(0, 128, 128, 1)">178</span>   
<span style="color: rgba(0, 128, 128, 1)">179</span>   cmp flag,<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">            ;检测是否曾遇到非0商值
</span><span style="color: rgba(0, 128, 128, 1)">180</span> <span style="color: rgba(0, 0, 0, 1)">    jne nor1            ;如遇到过,则不管商是否为0都输出显示
</span><span style="color: rgba(0, 128, 128, 1)">181</span>   cmp ax,<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">            ;如未遇到过,则检测商是否为0
</span><span style="color: rgba(0, 128, 128, 1)">182</span> <span style="color: rgba(0, 0, 0, 1)">    je cont                ;为0则不输出显示
</span><span style="color: rgba(0, 128, 128, 1)">183</span>   
<span style="color: rgba(0, 128, 128, 1)">184</span> <span style="color: rgba(0, 0, 0, 1)">nor1:
</span><span style="color: rgba(0, 128, 128, 1)">185</span> <span style="color: rgba(0, 0, 0, 1)">    mov dl,al            ;将商转换为ascii码输出显示
</span><span style="color: rgba(0, 128, 128, 1)">186</span> <span style="color: rgba(0, 0, 0, 1)">    add dl,30h
</span><span style="color: rgba(0, 128, 128, 1)">187</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">188</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)">189</span>   
<span style="color: rgba(0, 128, 128, 1)">190</span>   mov flag,<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">            ;曾遇到非0商,则将标志置1
</span><span style="color: rgba(0, 128, 128, 1)">191</span>   
<span style="color: rgba(0, 128, 128, 1)">192</span> <span style="color: rgba(0, 0, 0, 1)">cont:
</span><span style="color: rgba(0, 128, 128, 1)">193</span>   cmp bx,<span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">            ;检测权值是否已经修改到十位了
</span><span style="color: rgba(0, 128, 128, 1)">194</span> <span style="color: rgba(0, 0, 0, 1)">    je outer            ;如果相等,则完成最后的个位数输出显示
</span><span style="color: rgba(0, 128, 128, 1)">195</span>   
<span style="color: rgba(0, 128, 128, 1)">196</span> <span style="color: rgba(0, 0, 0, 1)">    xor dx,dx            ;将数位权值除以10
</span><span style="color: rgba(0, 128, 128, 1)">197</span> <span style="color: rgba(0, 0, 0, 1)">    mov ax,bx
</span><span style="color: rgba(0, 128, 128, 1)">198</span>   mov bx,<span style="color: rgba(128, 0, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">199</span> <span style="color: rgba(0, 0, 0, 1)">    div bx
</span><span style="color: rgba(0, 128, 128, 1)">200</span> <span style="color: rgba(0, 0, 0, 1)">    mov bx,ax
</span><span style="color: rgba(0, 128, 128, 1)">201</span>   
<span style="color: rgba(0, 128, 128, 1)">202</span> <span style="color: rgba(0, 0, 0, 1)">    mov ax,cx            ;将备份的余数送入AX
</span><span style="color: rgba(0, 128, 128, 1)">203</span> <span style="color: rgba(0, 0, 0, 1)">    jmp cov1                ;继续循环
</span><span style="color: rgba(0, 128, 128, 1)">204</span>   
<span style="color: rgba(0, 128, 128, 1)">205</span> <span style="color: rgba(0, 0, 0, 1)">outer:
</span><span style="color: rgba(0, 128, 128, 1)">206</span> <span style="color: rgba(0, 0, 0, 1)">    mov dl,cl            ;最后的个位数变为ascii码输出显示
</span><span style="color: rgba(0, 128, 128, 1)">207</span> <span style="color: rgba(0, 0, 0, 1)">    add dl,30h
</span><span style="color: rgba(0, 128, 128, 1)">208</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">209</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h   
</span><span style="color: rgba(0, 128, 128, 1)">210</span>   
<span style="color: rgba(0, 128, 128, 1)">211</span> <span style="color: rgba(0, 0, 0, 1)">    mov dl,space      ;输出空格
</span><span style="color: rgba(0, 128, 128, 1)">212</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">213</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)">214</span>   
<span style="color: rgba(0, 128, 128, 1)">215</span> <span style="color: rgba(0, 0, 0, 1)">    jmp loop_num      ;每次输出完一个数后,跳回循环去取下一个数
</span><span style="color: rgba(0, 128, 128, 1)">216</span>
<span style="color: rgba(0, 128, 128, 1)">217</span>   
<span style="color: rgba(0, 128, 128, 1)">218</span>
<span style="color: rgba(0, 128, 128, 1)">219</span> <span style="color: rgba(0, 0, 0, 1)">cx_3:
</span><span style="color: rgba(0, 128, 128, 1)">220</span>   mov bx,<span style="color: rgba(128, 0, 128, 1)">100</span><span style="color: rgba(0, 0, 0, 1)">      ;赋权值为100
</span><span style="color: rgba(0, 128, 128, 1)">221</span> <span style="color: rgba(0, 0, 0, 1)">    jmp cov1
</span><span style="color: rgba(0, 128, 128, 1)">222</span>      
<span style="color: rgba(0, 128, 128, 1)">223</span> <span style="color: rgba(0, 0, 0, 1)">not1:                ;不是回文数
</span><span style="color: rgba(0, 128, 128, 1)">224</span> <span style="color: rgba(0, 0, 0, 1)">    lea dx,nop1
</span><span style="color: rgba(0, 128, 128, 1)">225</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
<span style="color: rgba(0, 128, 128, 1)">226</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)">227</span> <span style="color: rgba(0, 0, 0, 1)">    enterline
</span><span style="color: rgba(0, 128, 128, 1)">228</span>   
<span style="color: rgba(0, 128, 128, 1)">229</span> <span style="color: rgba(0, 0, 0, 1)">    jmp stop         ;如输入不是回文数则返回起始点重新输入
</span><span style="color: rgba(0, 128, 128, 1)">230</span>   
<span style="color: rgba(0, 128, 128, 1)">231</span> <span style="color: rgba(0, 0, 0, 1)">error:                ;给出错误提示(输入不规范)
</span><span style="color: rgba(0, 128, 128, 1)">232</span> <span style="color: rgba(0, 0, 0, 1)">    lea dx,err
</span><span style="color: rgba(0, 128, 128, 1)">233</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
<span style="color: rgba(0, 128, 128, 1)">234</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)">235</span> <span style="color: rgba(0, 0, 0, 1)">    enterline
</span><span style="color: rgba(0, 128, 128, 1)">236</span>   
<span style="color: rgba(0, 128, 128, 1)">237</span> <span style="color: rgba(0, 0, 0, 1)">    jmp begin         ;如出错则返回起始点重新输入
</span><span style="color: rgba(0, 128, 128, 1)">238</span>   
<span style="color: rgba(0, 128, 128, 1)">239</span> <span style="color: rgba(0, 0, 0, 1)">yichu:                ;超过500范围的提示
</span><span style="color: rgba(0, 128, 128, 1)">240</span> <span style="color: rgba(0, 0, 0, 1)">    lea dx,out1
</span><span style="color: rgba(0, 128, 128, 1)">241</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
<span style="color: rgba(0, 128, 128, 1)">242</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)">243</span> <span style="color: rgba(0, 0, 0, 1)">    enterline
</span><span style="color: rgba(0, 128, 128, 1)">244</span>   
<span style="color: rgba(0, 128, 128, 1)">245</span> <span style="color: rgba(0, 0, 0, 1)">    jmp begin         ;如出错则返回起始点重新输入
</span><span style="color: rgba(0, 128, 128, 1)">246</span>   
<span style="color: rgba(0, 128, 128, 1)">247</span> <span style="color: rgba(0, 0, 0, 1)">stop:               
</span><span style="color: rgba(0, 128, 128, 1)">248</span> <span style="color: rgba(0, 0, 0, 1)">    MOV AH,4CH
</span><span style="color: rgba(0, 128, 128, 1)">249</span> <span style="color: rgba(0, 0, 0, 1)">    INT 21H
</span><span style="color: rgba(0, 128, 128, 1)">250</span>      
<span style="color: rgba(0, 128, 128, 1)">251</span> <span style="color: rgba(0, 0, 0, 1)">judge PROC                ;判断位数的子程序
</span><span style="color: rgba(0, 128, 128, 1)">252</span> <span style="color: rgba(0, 0, 0, 1)">    xor ax,ax
</span><span style="color: rgba(0, 128, 128, 1)">253</span> <span style="color: rgba(0, 0, 0, 1)">    xor dx,dx
</span><span style="color: rgba(0, 128, 128, 1)">254</span> <span style="color: rgba(0, 0, 0, 1)">    xor bx,bx
</span><span style="color: rgba(0, 128, 128, 1)">255</span> <span style="color: rgba(0, 0, 0, 1)">    xor cx,cx
</span><span style="color: rgba(0, 128, 128, 1)">256</span>   mov cx,<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">            ;最初长度赋值为1
</span><span style="color: rgba(0, 128, 128, 1)">257</span>   
<span style="color: rgba(0, 128, 128, 1)">258</span> <span style="color: rgba(0, 0, 0, 1)">    mov ax,si            ;将检测的数赋值给ax
</span><span style="color: rgba(0, 128, 128, 1)">259</span>   mov bx,<span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">            ;除数赋值10
</span><span style="color: rgba(0, 128, 128, 1)">260</span> <span style="color: rgba(0, 0, 0, 1)">    div bx
</span><span style="color: rgba(0, 128, 128, 1)">261</span>   cmp ax,<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">            ;商等于0就跳转,去判断回文数
</span><span style="color: rgba(0, 128, 128, 1)">262</span> <span style="color: rgba(0, 0, 0, 1)">    je judgeovr
</span><span style="color: rgba(0, 128, 128, 1)">263</span>   mov cx,<span style="color: rgba(128, 0, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">264</span>   
<span style="color: rgba(0, 128, 128, 1)">265</span> <span style="color: rgba(0, 0, 0, 1)">    xor dx,dx
</span><span style="color: rgba(0, 128, 128, 1)">266</span> <span style="color: rgba(0, 0, 0, 1)">    mov ax,si            ;将检测的数赋值给ax
</span><span style="color: rgba(0, 128, 128, 1)">267</span>   mov bx,<span style="color: rgba(128, 0, 128, 1)">100</span><span style="color: rgba(0, 0, 0, 1)">            ;除数赋值10
</span><span style="color: rgba(0, 128, 128, 1)">268</span> <span style="color: rgba(0, 0, 0, 1)">    div bx
</span><span style="color: rgba(0, 128, 128, 1)">269</span>   cmp ax,<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">            ;商等于0就跳转,去判断回文数
</span><span style="color: rgba(0, 128, 128, 1)">270</span> <span style="color: rgba(0, 0, 0, 1)">    je judgeovr
</span><span style="color: rgba(0, 128, 128, 1)">271</span>   
<span style="color: rgba(0, 128, 128, 1)">272</span>   mov cx,<span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">            ;表明当前为数应该为三
</span><span style="color: rgba(0, 128, 128, 1)">273</span> <span style="color: rgba(0, 0, 0, 1)">    jmp judgeovr      ;去判断回文数
</span><span style="color: rgba(0, 128, 128, 1)">274</span>
<span style="color: rgba(0, 128, 128, 1)">275</span> <span style="color: rgba(0, 0, 0, 1)">EXIT:
</span><span style="color: rgba(0, 128, 128, 1)">276</span> <span style="color: rgba(0, 0, 0, 1)">    RET
</span><span style="color: rgba(0, 128, 128, 1)">277</span> <span style="color: rgba(0, 0, 0, 1)">judge ENDP
</span><span style="color: rgba(0, 128, 128, 1)">278</span>
<span style="color: rgba(0, 128, 128, 1)">279</span> <span style="color: rgba(0, 0, 0, 1)">ascii_num PROC      ;将字符串转成数字的子程序
</span><span style="color: rgba(0, 128, 128, 1)">280</span>
<span style="color: rgba(0, 128, 128, 1)">281</span>   mov cl,buf+<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">    ;获取实际键入字符数,置于CX寄存器中
</span><span style="color: rgba(0, 128, 128, 1)">282</span> <span style="color: rgba(0, 0, 0, 1)">    xor ch,ch      ;ch清0
</span><span style="color: rgba(0, 128, 128, 1)">283</span>
<span style="color: rgba(0, 128, 128, 1)">284</span> <span style="color: rgba(0, 0, 0, 1)">    xor di,di      ;累加器清0
</span><span style="color: rgba(0, 128, 128, 1)">285</span> <span style="color: rgba(0, 0, 0, 1)">    xor dx,dx      ;dX寄存器清0
</span><span style="color: rgba(0, 128, 128, 1)">286</span>   mov bx,<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">      ;由于从个位数开始算起,因而将所乘权值设为1
</span><span style="color: rgba(0, 128, 128, 1)">287</span>   
<span style="color: rgba(0, 128, 128, 1)">288</span>   lea si,buf+<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">    ;将si指向接收到的第1个字符位置
</span><span style="color: rgba(0, 128, 128, 1)">289</span> <span style="color: rgba(0, 0, 0, 1)">    add si,cx      ;因为从个位算起,所以将si指向最后1个接收到的个位数
</span><span style="color: rgba(0, 128, 128, 1)">290</span> <span style="color: rgba(0, 0, 0, 1)">    dec si            ;往回减1使其指向字串最后一个元素
</span><span style="color: rgba(0, 128, 128, 1)">291</span>
<span style="color: rgba(0, 128, 128, 1)">292</span> <span style="color: rgba(0, 0, 0, 1)">cov:mov al,      ;取出个位数给al
</span><span style="color: rgba(0, 128, 128, 1)">293</span>   cmp al,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">'</span>      ;边界检查:如果输入不是0-<span style="color: rgba(0, 0, 0, 1)">9的数字,就报错
</span><span style="color: rgba(0, 128, 128, 1)">294</span> <span style="color: rgba(0, 0, 0, 1)">    jb error
</span><span style="color: rgba(0, 128, 128, 1)">295</span>   cmp al,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">9</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">296</span> <span style="color: rgba(0, 0, 0, 1)">    ja error
</span><span style="color: rgba(0, 128, 128, 1)">297</span>
<span style="color: rgba(0, 128, 128, 1)">298</span> <span style="color: rgba(0, 0, 0, 1)">    sub al,30h      ;将al中的ascii码转为数字
</span><span style="color: rgba(0, 128, 128, 1)">299</span> <span style="color: rgba(0, 0, 0, 1)">    xor ah,ah
</span><span style="color: rgba(0, 128, 128, 1)">300</span> <span style="color: rgba(0, 0, 0, 1)">    mul bx            ;乘以所处数位的权值
</span><span style="color: rgba(0, 128, 128, 1)">301</span>   cmp dx,<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">      ;判断结果是否超出16位数范围,如超出则报错
</span><span style="color: rgba(0, 128, 128, 1)">302</span> <span style="color: rgba(0, 0, 0, 1)">    jne error
</span><span style="color: rgba(0, 128, 128, 1)">303</span>   
<span style="color: rgba(0, 128, 128, 1)">304</span> <span style="color: rgba(0, 0, 0, 1)">    add di,ax      ;将形成的数值放在累加器di中
</span><span style="color: rgba(0, 128, 128, 1)">305</span> <span style="color: rgba(0, 0, 0, 1)">    jc error      ;如数值超过16位数范围报错
</span><span style="color: rgba(0, 128, 128, 1)">306</span>   
<span style="color: rgba(0, 128, 128, 1)">307</span>   cmp di,<span style="color: rgba(128, 0, 128, 1)">500</span><span style="color: rgba(0, 0, 0, 1)">      ;超过500的判断
</span><span style="color: rgba(0, 128, 128, 1)">308</span> <span style="color: rgba(0, 0, 0, 1)">    ja yichu
</span><span style="color: rgba(0, 128, 128, 1)">309</span>         
<span style="color: rgba(0, 128, 128, 1)">310</span> <span style="color: rgba(0, 0, 0, 1)">    mov ax,bx      ;将BX中的数位权值乘以10
</span><span style="color: rgba(0, 128, 128, 1)">311</span>   mov bx,<span style="color: rgba(128, 0, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">312</span> <span style="color: rgba(0, 0, 0, 1)">    mul bx
</span><span style="color: rgba(0, 128, 128, 1)">313</span> <span style="color: rgba(0, 0, 0, 1)">    mov bx,ax
</span><span style="color: rgba(0, 128, 128, 1)">314</span>   
<span style="color: rgba(0, 128, 128, 1)">315</span> <span style="color: rgba(0, 0, 0, 1)">    dec si            ;si指针减1,指向前一数位
</span><span style="color: rgba(0, 128, 128, 1)">316</span> <span style="color: rgba(0, 0, 0, 1)">    loop cov      ;按CX中的字符个数计数循环
</span><span style="color: rgba(0, 128, 128, 1)">317</span>   
<span style="color: rgba(0, 128, 128, 1)">318</span> <span style="color: rgba(0, 0, 0, 1)">       mov sum,di      ;将最终转换结果从di中放置到sum中
</span><span style="color: rgba(0, 128, 128, 1)">319</span> <span style="color: rgba(0, 0, 0, 1)">EXIT:
</span><span style="color: rgba(0, 128, 128, 1)">320</span> <span style="color: rgba(0, 0, 0, 1)">    RET
</span><span style="color: rgba(0, 128, 128, 1)">321</span> <span style="color: rgba(0, 0, 0, 1)">ascii_num ENDP
</span><span style="color: rgba(0, 128, 128, 1)">322</span>
<span style="color: rgba(0, 128, 128, 1)">323</span> <span style="color: rgba(0, 0, 0, 1)">CODES ENDS
</span><span style="color: rgba(0, 128, 128, 1)">324</span>   END START</pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>   </strong></p><br><br>
来源:https://www.cnblogs.com/xwh-blogs/p/12576877.html
頁: [1]
查看完整版本: 汇编语言之判断回文数