您的位置:首页 > 其它

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

2016-01-25 11:55 489 查看
编写汇编语言程序,找出所有 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语言程序的结果相同。
;==============================================
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: