请教bt位测试指令的含义

ldlihuanfa 2011-10-08 06:09:49
8086汇编中说。操作数oprd2除以oprd1的长度所得商,这个oprd1的长度是指什么?16,或是32?

有个例子是:

imaege dw 1234h,5678h

imaged dd 12345678h

bt imagew,4

mov cx,22

btc imagew ,cx ;cf=1 [imaew+2]=5638h

这最后一行代码:这个位移2是如何算出来的,用22除以16吗?所得商也不是2啊。

糊涂中///
...全文
335 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ldlihuanfa 2011-10-09
  • 打赏
  • 举报
回复
[]Assembly codeimagew dw 1234h, 5678h
mov cx, 22
btc imagew ,cx ; cf=1 [imaew+2]=5638h
; 这里其实无须对 22 进行折算,直接从 imagew 开始向后数 22 个位即可。折算了对理解反而有误导之嫌
; 要折算,也是看 imagew 是定义为 word 类型,一个 word 类型是 16 个位即 2 个字节,
; 22 除以 16 得 1 (1 个 word 即 2 个字节) 余 6, 所以即相当于 imagew[2] 处的位6 的内容



直接从 imagew 开始向后数 22 个位即可


1234h是15位,然后是8,变成19位,还要再数3位..
然后是7 ,值为0111b,在内存中由低向高的排列是:1110,第三位设为0然后排列变成 1100,这个值应该是0011b,数值正好是3,结果就是5638h了

不知道这样理解是否正确?
zara 2011-10-09
  • 打赏
  • 举报
回复
不是 #5 这个意思吧。
操作数1 是通用寄存器时,操作数2 则会被 16 或 32 取余数;究竟是 16 还是 32 ,看当前操作数模式,即 dos16 类的为 16 ,Win32 类的则为 32 了。这样就可以对寄存器的 0-15 或 0-31 位进行测试。
如果操作数1 是内存的话,操作数2 就指定了 -2^31 至 2^31-1 范围,不对操作数2 进行任何处理的。

imagew dw 1234h, 5678h
mov cx, 22
btc imagew ,cx ; cf=1 [imaew+2]=5638h
; 这里其实无须对 22 进行折算,直接从 imagew 开始向后数 22 个位即可。折算了对理解反而有误导之嫌
; 要折算,也是看 imagew 是定义为 word 类型,一个 word 类型是 16 个位即 2 个字节,
; 22 除以 16 得 1 (1 个 word 即 2 个字节) 余 6, 所以即相当于 imagew[2] 处的位6 的内容
  • 打赏
  • 举报
回复
位串如果是内存,当成16G位(2GB字节)的小端存储的整数,定位bit就可以了。div、mod之类的只是方便你算出该位的位序。唯一需要注意的是,查找的位索引是负值的话,位序是逆的(字节中从左到右排列位)。
ldlihuanfa 2011-10-08
  • 打赏
  • 举报
回复
在网上查了资料,发现书中的说法非常不清楚。下面总结了一下?
当操作数2是8位立即数时,无论操作数1是通用寄存器还是存储器这个数值就是操作数1要测试的位。。

也就是说立即数只能是8位,但实际上只能是在0到31吧。。

当操作数1是通用寄存器,操作数2中的值也是给出的直接测试的位,也就是只能0到31之间



当操作数1是存储器的话,操作数2的值除以操作数1的长度。所得到的商作为相对偏移量。。余数作为要操作的位号??

在上面的例中,操作数2是22,那么除以16,商是1,余数是6??//还是不对??

ldlihuanfa 2011-10-08
  • 打赏
  • 举报
回复
这个测试的位是23?正好是17h,?并不是说这个数值就是测试的位?是除以操作数1的长度?这个长度我不明白是什么?
  • 打赏
  • 举报
回复
例子:
mov eax,0ff8055aah ; (bit31) -> 1111 1111 (1)000 0000 0101 0101 1010 1010 <-(bit0)
bt eax,17h________ ;_______________________^---> CF
  • 打赏
  • 举报
回复
格式怎么没了?

例子:
mov eax,0ff8055aah ; (bit31) -> 1111 1111 (1)000 0000 0101 0101 1010 1010 <-(bit0)
bt eax,17h ; (bit31) -> 1111 1111 (^---> CF
  • 打赏
  • 举报
回复
例子:
mov eax,0ff8055aah ; (bit31) -> 1111 1111 (1)000 0000 0101 0101 1010 1010 <-(bit0)
bt eax,17h ; ^---> CF

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧