这是我们第一节汇编上机的实验题目,
问题描述:在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