找出所有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语言程序的结果相同。
;==============================================
例如: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语言程序的结果相同。
;==============================================
相关文章推荐
- 80x86汇编语言编程--
- 51单片机汇编语言--延时程序的延时时间
- 用80x86汇编语言编程:输入字符串,并把大写字符转为小写再输出
- 用80x86汇编语言编程--用递归方法求阶乘
- WC联合训练总结
- tomcat 加 gzip 压缩
- [问题记录] openssl error:0906D064:PEM routines:PEM_read_bio:bad base64 decode
- 淘宝双飞翼布局,两边固定中间自适应布局。中间内容先显示。
- SSH端口转发
- SpringMVC实战
- 用80x86汇编语言编程--统计1和0的个数,并显示
- 很好的c++和Python混合编程文章
- 中值滤波
- 80x86汇编:将AL中的8位无符号数转换为压缩型BCD数放入AX
- 51单片机 汇编语言 两道题
- 等待春天
- 《血色浪漫》中秦岭的陕北民歌
- 顺序输出片内RAM的数据
- 用80x86汇编语言编程--过滤数字符号,并且大小写转换
- iOS开发之简单多语言开发