汇编语言中 si*2 具体指什么意思? 20

遇到个汇编语言问题,例题是这样的例5.7在附加段中,有一个按从小到大顺序排列的无符号数数组,其首地址存放在DI寄存器中,数组中的第一个单元存放着数组长度。在AX中有一个无... 遇到个汇编语言问题,例题是这样的
例5.7 在附加段中,有一个按从小到大顺序排列的无符号数数组,其首地址存放在DI寄存器中,数组中的第一个单元存放着数组长度。在AX中有一个无符号数,要求在数组中查找(AX),如找到,则使CF = 0,并在SI中给出该元素在数组中的偏移地址;如未找到,则使CF = 1。

1,shl si,1 ; 看书上的解释是si*2的意思
这里我想知道,这个si乘2后的si是指什么意思?
2,test si,1 ; (si)是否为偶数
这里我想知道,si偶数不偶数能怎么样?为什么非得一定是偶数不可?
3,cmp si,2 ; (si)=2?
这里的比较si是否等于2,跟test si,1有区别么?

这个书上的解我在下边列出来
dseg segment
start_addr dw ?
dseg ends

cseg segment
b_search proc far
assume cs:cseg,ds:dseg
push ds
push ax
mov ax,dseg
mov ds,ax
pop ax

cmp ax,es:[di+2] ; (ax)与第一个元素比较
ja chk_last ; (ax)大于第一个元素则转到chk_last
lea si,es:[di+2] ; 第一个元素地址送si
je exit ; (ax)等于第一个元素则找到退出
stc ; (ax)小于第一个元素则给cf置1
jmp exit ; 未找到退出
chk_last:
mov si,es:[di] ; 数组长度送si
shl si,1 ; (si)*2
add si,di ; si中存放最后一个元素的地址
cmp ax,es:[si] ; (ax)与最后一个元素比较
jb search ; (ax)小于最后一个元素则转到search
je exit ; (ax)等于最后一个元素则找到退出
stc ; (ax)大于最后一个元素则给cf置1
jmp exit ; 未找到退出

; (ax)大于第一个元素而小于最后一个元素
search: mov start_addr,di ; 把数组首地址存入内存单元start_addr
mov si,es:[di] ; 数组长度送si以形成中间元素下标
even_idx:
test si,1 ; (si)是否为偶数
jz add_idx ; (si)为偶数则转add_idx
inc si ; (si)为奇数则加1变成偶数
add_idx: add di,si ; 计算中间元素地址
compare: cmp ax,es:[di] ; (ax)与中间元素比较
je all_done ; 相等则找到转all_done
ja higher ; 大于则转higher

; 在低半部查找
cmp si,2 ; (si)=2?
jne idx_ok ; 不等转idx_ok
no_match:
stc ; (si)=2查找失败给cf置1
je all_done ; 转all_done
idx_ok: shr si,1 ; (si)/2
test si,1 ; (si)是否为偶数
jz sub_idx ; (si)为偶数则转sub_idx
inc si ; (si)为奇数则加1变成偶数
sub_idx: sub di,si ; 计算中间元素地址
jmp short compare ; 转compare

; 在高半部查找
higher: cmp si,2 ; (si)=2?
je no_match ; (si)=2转no_match
shr si,1 ; (si)/2
jmp short even_idx; 转even_idx

all_done:
mov si,di ; 比较地址送si
mov di,start_addr ; 恢复数组首地址
exit: pop ds
ret

b_search endp
cseg ends
展开
 我来答
汤旺河边
2009-03-12 · TA获得超过2.9万个赞
知道大有可为答主
回答量:2675
采纳率:0%
帮助的人:2960万
展开全部
1、shl si,1
这个si乘2后的si是指:这个无符号数数组在内存中所占的字节数(程序默认每个数组元素是一个字,即两个字节),加上数组首地址DI,正好指向这个数组的最后一个元素。

2、test si,1
此时的si存放的是数组长度,这个长度是指数组元素个数,而非指数组在内存中所占的字节数。但因为每个数组元素占两个字节,为准确确定数组中间元素的地址,必须判断其是否为偶数。是偶数则不用调整;否则,必须加1调整为偶数。如不这样做,当si为奇数时,若不加1调整,就会指向中间元素的高字节和下一个元素的低字节。

3、cmp si,2 ; (si)=2?
这里的比较si是否等于2,跟test si,1有很大区别。指令cmp si,2是判断si是否等于2,而指令test si,1则是判断si是偶数还是奇数,2是偶数,但偶数不一定非得是2,可以是其它偶数,如4、6、8等等。
百度网友c3cc3f948
2009-03-15 · TA获得超过150个赞
知道答主
回答量:77
采纳率:0%
帮助的人:0
展开全部
1,shl si,1 ;si左移一位(二进制的一位)就是si=si*2,

2,test si,1 ; (si)是否为偶数
偶数对齐是程序为了快速执行,这里的AX是16位长的,对16位长的一般用偶对齐,如是32位的就要用4对齐了。

3,cmp si,2 ; (si)=2?
test 是位与运算,cmp是减法运算,如test a,b就是a and b;cmp a,b就是 a-b它们都不改变操作数的值,只是根据结果设置标志CF ZF OF SF.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
彡敬0y
2009-03-14
知道答主
回答量:23
采纳率:0%
帮助的人:0
展开全部
1
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式