一道简单题目的复杂算法

博主分享了一道汇编实验题目,要求根据内存区数值判断条件并设置3000H单元。博主通过创新思路,避免使用比较和跳转语句,利用位移和进位标志巧妙地实现了这一功能。详细解释了算法过程,包括如何判断正、负、零三种情况,并给出了DEBUG下的指令输入示例。
摘要由CSDN通过智能技术生成

这是我们第一节汇编上机的实验题目, 

问题描述:在debug下实现,内存区2100H处有一个字节带符号数(用E命令存入),要求编程将其取出1、若此数为正,则3000H单元置01H,2、若此数为0,3000H单元置0H,3、若此数为负,3000H单元置FFH。

题目很简单,应该说简单得让人做着无聊,于是呢一切的想法就在无聊中给闷出来了。

我很讨厌判断语句,于是就想,能不能不用比较和跳转的语句将问题解决掉呢?答案当然是肯定的,于是就有了我这个复杂化的答案了。

方法如下:如果这个数是负数,那么它的最高位为1,那么,使用SHL  OPT,1就可以将它的最高位移至CF标志位,然后用ADC  DST,0就可以将CF中的数据取出来反映到DST里面,据此可以判断它是不是负数。

至于0和正数,将原数据加FFH,只有当原数据为0时才可以产生进位,然后再用上面的方法取出进位标志。

在debug下输入如下:

a 100                              
mov dl,0                            ;DL中存放比较结果,先清零
mov bl,[2100]                   ;取数据
shl bl,1                              ;左移
mov cl,0
adc cl,0                             ;将CF的值反映到CL里
mov al,ff
mul cl
add dl,al                           ;给DL赋值,整个过程中最多有一次有效
inc al
mov cl,al                           ;建立负数标志,BL为负则CL为0,否则CL为1
mov bl,[2100]                  ;进行下一次运算
add bl,ff
mov al,0
adc al,0
mul cl
mov cl,1
mul cl
add dl,al
mov [3000],dl
int 20

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值