在原码当中查找最大、最小值

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% 名人
提问者对于答案的评价:感谢
;------------------------------------------------------

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值