问一个汇编程序的问题

来源:百度知道 编辑:UC知道 时间:2024/09/21 18:24:40
已知一个字符串首地址为STRING
MOV SI,OFFSET STRING
CMP STRING[SI],Al
这个程序第二行里的STRING[SI]是什么意思啊,书上解释是从字符串取出字符进行比较,难道字符的地址是STRING+[SI],说不通吧?
另外还有一个类似程序把SI的初值设为0FFH,比较的是长度为100的数组,可是为何要把SI的初值设为0FFH呢?
我还是给出所有程序吧
1.
设有一字符串,长度为N,首地址为STRING,要在其中找出有没有字符“#”
MOV SI, OFFSET STRING;字符串首址偏移地址给SI
MOV CX, N
MOV AL, #'
NEXT: CMP AL,STRING[SI]
INC
LOOPNZ NEXT

2.
设有两个16位数组DATA1和DATA2,数组长度为100个,计算两数组对应元素相加之和,送首地址为SUM 的数据区中,且当两数组对应项均出现0的项时停止程序
MOV AX, 0
MOV SI, 0FFH;设指针初值
MOV CX,64H
NZERO: INC SI
MOV AX,DATA1[SI];取被加数
ADD AX,DATA2[SI];相加
MOV SUM[SI],AX;和存入SUM数据区
LOOPNZ NZERO
HLT

这两个程序都是一本书上的例题,凡是出现SI的地方我都不太明白什么意思

你说的那2行代码肯定不对!
如果用第1行,那么第2行就该是CMP [SI],Al;
如果用第2行不变,那么第1行就该是MOV SI,0

第2个问题:要看程序的前后文的,只说这一句无从谈起。
猜测SI可能是访问数组的指针,所以它本来和100也没有关系,100应该是控制循环次数的量。

关于补充:
1、这是错误的!要么把“MOV SI, OFFSET STRING”换成“MOV SI, 0”,要么把“NEXT: CMP AL,STRING[SI] ”换成“NEXT: CMP AL,[SI] ”这样就对了。

2、这个也是错的!我晕,谁写的书?
那一句应该是MOV SI,0FFFFh,循环次数是100(MOV CX,64H),而循环体(从标号NZERO处开始)中首先执行INC SI,于是第1次进入循环体SI变成了0(0FFFFh+1=10000h,SI只有16位,最高位的进位1会自动“丢失”,于是SI=0000h),你可以把这里的SI理解成访问那3个数组的下标,所以后面是将DATA1和DATA2的第一个元素相加,和放入SUM的第一个元素位置,然后循环回去,SI继续增加,依次处理其数组中的其它元素。

把string理解为一个数组名吧。其实就是cmp[string+si],al。只不过规定的写法string写在前面。我这么说吧,后面肯定有人给出详细的解释。

看不明白,会不会是书上错了。

第二个问题那个SI用来干什么的你没说清楚,给点代码吧!

将STRING偏移值放入SI,然后将AI的值与地址STRING+SI的值进行比较.第二个问题应该是地址DS:SI,其中偏移地址SI为0FFh.这是我个人理解