30H--3FH 单元中存有16个符号数原码 找出最大存入40H 最小存入41H 需要判断正负。
要求用51单片机的汇编语言编写程序。
题目网址:http://zhidao.baidu.com/question/339105242.html
计算机中的机器数,如果是代表“带符号数”,一般都是使用“补码”形式。
因为“补码”形式在计算机内部,与“无符号数”的计算方法相同,可以通用一个ALU(算术逻辑单元)。
而上面的题目中,却使用了“原码”,这就应该进行变换,变成便于比较计算的码制。
但是,进行大小比较,使用“补码”,还并非是最好的形式,最好是使用“移码”。
下图分别给出了使用“原码”、“补码”和“移码”时的真值和机器数的关系。
图片链接:http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/album/item/32d640df73433d2ecebf1a7e.html
从上面的插图中可以看出,只有使用“移码”表示法,“机器数的大小”和“真值的大小”排列规律才是一致的。
那么最好是先把“原码”变换成“移码”再比较大小,找出最大、最小数字后,再把它们变换成原码即可。
为了调试、检验程序,预先得存入16个杂乱的正、负数据。
编译系统默认的存储方法是以“补码”形式写入的,为了配合题目的要求,还要把它们先变换成“原码”。
之后,再按照上述的分析,变成“移码”、查找最大、小值,最后再变回为“原码”。
程序如下:
ORG 0000H
CALL Preparation ;数据准备, 在50H~5FH中, 安排了16个原码
;--------------------下面先变成移码
MOV R0, #50H ;起始地址
MOV R2, #16
L2: MOV A, @R0 ;取来原码
ADD A, #128
JB ACC.7, S2 ;正数就跳过
CPL A ;负数则要再求反加一
INC A
CLR ACC.7
S2: MOV @R0, A ;保存移码
INC R0
DJNZ R2, L2
;--------------------下面查找最大、最小值
MOV 40H, #128 ;移码的0
MOV 41H, #128
;--------
MOV R0, #50H ;数据比较
MOV R2, #8
L3: MOV A, @R0
CJNE A, 40H, $ + 3
JC N0
MOV 40H, A ;存储最大值
N0: CJNE A, 41H, $ + 3
JNC N1
MOV 41H, A ;存储最小值
N1: INC R0
DJNZ R2, L3 ;循环16遍就查找完毕
;--------------------下面把移码变成原码
MOV A, 40H ;最大
CPL ACC.7
JNB ACC.7, S4
CPL A
INC A
SETB ACC.7
S4: MOV 40H, A ;保存
;--------
MOV A, 41H ;最小
CPL ACC.7
JNB ACC.7, S5
CPL A
INC A
SETB ACC.7
S5: MOV 41H, A ;保存
;----------------------
SJMP $ ;结束
;-----------------------------------
Preparation: ;数据准备
MOV 30H, #25 ;写入16个杂乱的数据
MOV 31H, #-59
MOV 32H, #120
MOV 33H, #74
MOV 34H, #-65
MOV 35H, #-100
MOV 36H, #43
MOV 37H, #-26
MOV 38H, #-1
MOV 39H, #12
MOV 3AH, #49
MOV 3BH, #20
MOV 3CH, #-47
MOV 3DH, #-29
MOV 3EH, #-40
MOV 3FH, #-2 ;上面16行, 都是以补码形式存放的
;----------------------
MOV R0, #30H
MOV R1, #50H ;复制到50H开始的区域
MOV R2, #16
L0: MOV A, @R0
MOV @R1, A
INC R0
INC R1
DJNZ R2, L0
;----------------------
MOV R0, #50H ;按照要求变成原码
MOV R2, #16
L1: MOV A, @R0
JNB ACC.7, S1
CPL A
INC A
SETB ACC.7
S1: MOV @R0, A
INC R0
DJNZ R2, L1
RET
;-----------------------------------
NOP
end
上述程序运行后,在 40H、41H 中,分别出现了 78H、E4H,它们分别是 120、-100 的原码。
实验的时候,变换了多组数字,均证明本程序是正确的。
;------------------------------------------------------
原题网址:http://zhidao.baidu.com/question/339105242.html
悬赏分:200
回答者: 做而论道 | 十五级 采纳率:43% 名人
提问者对于答案的评价:感谢
;------------------------------------------------------