注册 登录
编程论坛 汇编论坛

我对这个题不懂

wzx711215 发布于 2006-09-16 17:40, 693 次点击
T:在所在定义的字节数组中找出第一个非0数据,并显示出其所在数组的下标。
DATA SEGMENT
ARRAY DB 0,0,0,16,0,88,72,0,35,42,99
COUNT EQU $-ARRAY
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV AX, DATA
MOV DS, AX
MOV CX, COUNT
MOV DI, -1
AGAIN: INC DI
CMP ARRAY[DI], 0
LOOPZ AGAIN
MOV DX, DI
OR DL, 30H
DISPLAY: MOV AH, 2H
INT 21H
MOV AH, 4CH
INT 21H
........
在这个题里1:下标是什么?
2:OR的结果是什么,是怎样算出来的
9 回复
#2
菜鸟上路2006-09-16 23:05

1、偏移量
2、先转换成二进制

#3
wzx7112152006-09-17 08:07

MOV DX, DI (是把找到的第一个非0数据送给DX)
OR DL, 30H (把第一个非0数据和30H相或)

这是一个例题,可她讲的说是OR DL, 30H 是为了得到第一个非0数据的ASCII码,不知道是不是她讲错了

#4
菜鸟上路2006-09-17 18:11
没讲错。
30H的ASCII是48,就是字符0
如果进行OR运算,相当于在DL的基础上加48
#5
wzx7112152006-09-17 21:04
首先感谢这位大哥:针对上面这道题(DL)=16D=0001 0000B
30H=0011 0000B
若让他们按位“或”应该是0011 0000还是30H
而老师所讲的和你说的是一样的
但从二进制上进行“或”运算我不知道是怎样算错了
#6
菜鸟上路2006-09-17 21:44
“或”运算只要是1,就在相应位加1
如:
10110000
or 00101101
------------
10111101
对于你上面说的,我有点不太明白
#7
wzx7112152006-09-18 08:38

你写的我能看懂,不过我还是不明白,请你把16转换成二进制,再和30H“或”,这个过程我不懂。先行谢过

#8
菜鸟上路2006-09-18 12:24

我明白你说的了,这个到是没想到

#9
srl99732006-09-18 15:53

MOV DX, DI (是把找到的第一个非0数据送给DX)应该是把第一个非0数据对应的偏移地址送给DX
OR DL, 30H (把第一个非0数据和30H相或)这个地方这样操作存在这样一个假设:第一个非0的数据地址不能大于9。否则这个程序就出错了。当 偏移地址不大于9时,将DL中的数与30H进行或运算就相当于将DL中的加上30H转换成 它所对应的ASCII,就可以用21H调用 中2号功能输出了。

#10
wzx7112152006-09-18 18:07
谢谢大哥  我明白了。
1