找出所有n的平方具有对称性质(也称回文数)的数

编写汇编语言程序,找出所有 n 的平方(0 <= n < 256)具有对称性质(也称回文数)的数,显示在屏幕上。
例如:n = 111,n^2 = 12321,12321就是一个回文数。

题目网址:http://zhidao.baidu.com/question/364874672.html

;===============================================

关于回文数的题目,做而论道以前编写过C程序,可见:
http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/d50edc2fcb37de464ec22663.html

以前的程序,处理的是键入字符串,现在改成遍历数字的处理,那就更简单了。

程序如下:

#include<stdio.h>
void main()
{
    int i, j, k;
    for (i = 0; i < 256; i++) { //循环256次

      j = i * i;             //求出平方
      k = 0;                 //反序数

      while (j > 0) {
        k = k * 10 + j % 10; //把平方数的最低位, 放入反序数
        j = j / 10;          //去掉平方数的最低位
      }                      //循环到平方值为0

      if (k == i * i)  printf("\n %d * %d = %d", i, i, i * i);  //如果反序数等于原数的平方,就输出显示
    }
}     //呵呵,结束了,程序就是这么简单 !

/*
程序执行后,屏幕显示如下:

 0 * 0 = 0
 1 * 1 = 1
 2 * 2 = 4
 3 * 3 = 9
 11 * 11 = 121
 22 * 22 = 484
 26 * 26 = 676
 101 * 101 = 10201
 111 * 111 = 12321
 121 * 121 = 14641
 202 * 202 = 40804
 212 * 212 = 44944

*/

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
但是,本题目是要求使用汇编语言编程。
用汇编语言编程,显然就要复杂多了,所以能使用汇编的人很少。
做而论道用汇编语言编写了程序,自己认为,还是比较精练的。
请网友们对照前面的C程序,看看能不能理解?
;
;程序如下:
;
;==============================================
DATA SEGMENT           ;数据段,用于设定变量
    x0   DB  0     
    P_F  DW  ?    ;x0^2

    UH   DW  ?    ;商
    YU   DW  ?    ;余

    F_P  DW  ?    ;反序数
DATA ENDS
;==============================================
CODE   SEGMENT         ;代码段.
    ASSUME   CS: CODE, DS: DATA
START:
    MOV  AX, DATA
    MOV  DS, AX
    CALL CR
;------------------------------
LOP:
    MOV  AL, x0
    MUL  x0
    MOV  P_F, AX  ;平方值

    MOV  UH, AX   ;再存一次,当做商

    MOV  F_P, 0   ;反序数清零
;-----------------------
L2: MOV  AX, UH   ;取上次的商
    MOV  DX, 0
    MOV  BL, 10   ;除数
    MOV  BH, 0
    DIV  BX       ;除以10
    MOV  UH, AX   ;存商
    MOV  YU, DX   ;存余
;-----------------
    MOV  AX, F_P  ;取反序数
    MOV  BX, 10
    MUL  BX       ;乘以10
    ADD  AX, YU   ;加上余数
    MOV  F_P, AX  ;保存反序数

    CMP  UH, 0    ;商=0?
    JNZ  L2       ;非0继续
;-----------------------
    MOV  AX, P_F  ;取来平方值
    CMP  AX, F_P  ;和反序数比较
    JNZ  NEXT     ;不等就转移
    CALL DISP     ;相等则显示
;-----------------
NEXT:
    INC  x0       ;下一个
    CMP  x0, 0    ;=256?
    JNZ  LOP      ;不等则继续
;-----------------------
    MOV  AH, 4CH  ;结束程序
    INT  21H
;------------------------------
DISP:
    MOV  AL, x0
    MOV  AH, 0
    CALL PRINTAX
    MOV  DL, ':'
    MOV  AH, 2
    INT  21H
    MOV  DL, ' '
    MOV  AH, 2
    INT  21H

    MOV  AX, P_F
    CALL PRINTAX

CR:
    MOV  DL, 10
    MOV  AH, 2
    INT  21H
    MOV  DL, 13
    MOV  AH, 2
    INT  21H
    RET
;------------------------------
PRINTAX PROC  
    MOV  BX, 10
    OR   AX, AX
    JZ   _0_
LOOP_P:
    XOR  DX, DX
    DIV  BX
    MOV  CX, AX     ;商.
    OR   CX, DX
    JZ   _E_       
    PUSH DX  
    CALL LOOP_P     ;递归.
    POP  DX        
    ADD  DL, '0'   
    JMP  _1_
_0_:MOV  DL, '0' 
_1_:MOV  AH, 2
    INT  21H
_E_:RET
PRINTAX ENDP
;------------------------------
CODE  ENDS
    END  START
;==============================================

上述的汇编程序,经过编译、连接,执行后的显示如下:

c:\masm>HVWF

0: 0
1: 1
2: 4
3: 9
11: 121
22: 484
26: 676
101: 10201
111: 12321
121: 14641
202: 40804
212: 44944

可以看出,和C语言程序的结果相同。

;==============================================

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值