汇编语言中 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 展开
例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 展开
展开全部
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等等。
这个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等等。
展开全部
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.
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.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询