初学汇编,一个小问题求解

andylhq 2009-10-24 11:52:29
MOV AL,8CH
SHL AL,1 ;执行后OF标志为什么是1
MOV CL,6
SHL AL,CL ;执行后OF标志为什么是0


...全文
148 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
andylhq 2009-10-25
  • 打赏
  • 举报
回复
我来答一下,记得给分!
算术,逻辑,循环移位,只在移一位的情况下OF位才有效(移位前后最高位不等,OF=1),否则没定义。

书上貌似没说移一位of位才有效,敢问大虾这句话从何求证呢?

andylhq 2009-10-25
  • 打赏
  • 举报
回复
突然想到一个疑问:
OF位是只对有符号数有效的,那么
MOV AL,8CH
SHL AL,1

这里是把8CH看做有符号数,为什么不把8CH看做无符号数呢?这样OF应该不会置位了吧?在汇编里怎么区分无符号数和有符号数呢?
andylhq 2009-10-25
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 nanlingcg 的回复:]
引用 18 楼 andylhq 的回复:
我来答一下,记得给分!
算术,逻辑,循环移位,只在移一位的情况下OF位才有效(移位前后最高位不等,OF=1),否则没定义。

书上貌似没说移一位of位才有效,敢问大虾这句话从何求证呢?



是要找该说法的出处还是说我附加的简短代码不可以参考验证呢?
出处我不大记得了,您总不会要我把我所看过的教材和资料(有些资料还可能是在网上看到的,茫茫网海叫我怎么再找去啊?)都再滤一遍吧?
要求证,那个简短代码应该可以参考了,真觉得心底还有怀疑,自己还可以写点实践下,还是不相信就只有不信那个说法了(也当我没说就是了)....
[/Quote]
不是不信呀,只是想弄个明白,我查了下资料,你的说法是正确的,当移位操作大于一位时,of位是无定义的

谢谢了
nanlingcg 2009-10-25
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 andylhq 的回复:]
我来答一下,记得给分!
算术,逻辑,循环移位,只在移一位的情况下OF位才有效(移位前后最高位不等,OF=1),否则没定义。

书上貌似没说移一位of位才有效,敢问大虾这句话从何求证呢?


[/Quote]
是要找该说法的出处还是说我附加的简短代码不可以参考验证呢?
出处我不大记得了,您总不会要我把我所看过的教材和资料(有些资料还可能是在网上看到的,茫茫网海叫我怎么再找去啊?)都再滤一遍吧?
要求证,那个简短代码应该可以参考了,真觉得心底还有怀疑,自己还可以写点实践下,还是不相信就只有不信那个说法了(也当我没说就是了)....
andylhq 2009-10-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ip5636626 的回复:]
10001100左移动1位  1出去了,肯定溢出
之后再移6位同理!

[/Quote]

当再移6位时11也移出去了,应当也溢出了,为什么此时OF为0呢?
ip5636626 2009-10-24
  • 打赏
  • 举报
回复
10001100左移动1位 1出去了,肯定溢出
之后再移6位同理!
nearcheng 2009-10-24
  • 打赏
  • 举报
回复
SHL逻辑左移指令啊 百度一下不就只知道啦 晕
nanlingcg 2009-10-24
  • 打赏
  • 举报
回复
TO borefo朋友:
学习需要怀疑,怀疑后要 求证并验证,所以我在回答时为了使很多和我一样的初学者能够很快解疑,特地写了能方便初学者验证的简短代码,就是为了方便朋友们验证。。。当然,朋友们也可以自行求证。。。

请问如何查看OF的值呢?
不要告诉我你不会DEBUG--那我就怀疑你。。。(玩笑话咯!)
borefo 2009-10-24
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 nanlingcg 的回复:]
上面的    MOV AX,DATAS
          MOV DS,AX
      是多余的,忘了删了,补充说明一下。
[/Quote]

请问如何查看OF的值呢?
j8727 2009-10-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 nanlingcg 的回复:]
我来答一下,记得给分!
算术,逻辑,循环移位,只在移一位的情况下OF位才有效(移位前后最高位不等,OF=1),否则没定义。
大家可以通过下面来程序来参考:
CODES SEGMENT
    ASSUME CS:CODES
START:
    MOV AX,DATAS
    MOV DS,AX
    MOV AL,99H
    MOV BL,AL
    SHL AL,1
    SHL AL,1
    SHL AL,1
    SHL AL,1
    SHL AL,1
    SHL AL,1
    SHL AL,1
    SHL AL,1
   
    MOV AL,BL      ;从这里开始OF将不守章法!
    MOV CL,2         
    SHL AL,CL
    MOV AL,BL
    MOV CL,3         
    SHL AL,CL
    MOV AL,BL
    MOV CL,4         
    SHL AL,CL
    MOV AL,BL
    MOV CL,5         
    SHL AL,CL
    MOV AL,BL
    MOV CL,6         
    SHL AL,CL
    MOV AL,BL
    MOV CL,7         
    SHL AL,CL
    MOV AL,BL
    MOV CL,8         
    SHL AL,CL
   
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START



[/Quote]
学习了
borefo 2009-10-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fandelei1982 的回复:]
移位前与移位后,最高位不同时,OF为1,否则OF为0
[/Quote]

这个说法正确么?学习
borefo 2009-10-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 desdouble 的回复:]
shl 是逻辑左移指令。

移位指令,不管是逻辑移位,算术移位,不管是左移还是右移,在执行后,被“移”出去的位会放到标志寄存器的OF位中。

开始AL寄存器中存放的是10001100,shl执行后最左侧的"1",被“移”出去,并放到OF位中。此时,AL变成,00011000,OF置"1"。

接下来的一个shl al, cl指令是向左移al=6位。此时AL变成00000000,最后被移出去的位是"0",OF置"0"。
[/Quote]

移出的最高位应该进入CF,不是OF
nanlingcg 2009-10-24
  • 打赏
  • 举报
回复
上面的 MOV AX,DATAS
MOV DS,AX
是多余的,忘了删了,补充说明一下。
nanlingcg 2009-10-24
  • 打赏
  • 举报
回复
我来答一下,记得给分!
算术,逻辑,循环移位,只在移一位的情况下OF位才有效(移位前后最高位不等,OF=1),否则没定义。
大家可以通过下面来程序来参考:
CODES SEGMENT
ASSUME CS:CODES
START:
MOV AX,DATAS
MOV DS,AX
MOV AL,99H
MOV BL,AL
SHL AL,1
SHL AL,1
SHL AL,1
SHL AL,1
SHL AL,1
SHL AL,1
SHL AL,1
SHL AL,1

MOV AL,BL ;从这里开始OF将不守章法!
MOV CL,2
SHL AL,CL
MOV AL,BL
MOV CL,3
SHL AL,CL
MOV AL,BL
MOV CL,4
SHL AL,CL
MOV AL,BL
MOV CL,5
SHL AL,CL
MOV AL,BL
MOV CL,6
SHL AL,CL
MOV AL,BL
MOV CL,7
SHL AL,CL
MOV AL,BL
MOV CL,8
SHL AL,CL

MOV AH,4CH
INT 21H
CODES ENDS
END START


TonyXQQ 2009-10-24
  • 打赏
  • 举报
回复
对应该是CF
XQQ524148626 2009-10-24
  • 打赏
  • 举报
回复
-r
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B33 ES=0B33 SS=0B33 CS=0B33 IP=0100 NV UP EI PL NZ NA PO NC
0B33:0100 E82E01 CALL 0231
-a
0B33:0100 mov al,8c
0B33:0102 shl al,1
0B33:0104 mov cl,6
0B33:0106 shl al,cl
0B33:0108
-t

AX=008C BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B33 ES=0B33 SS=0B33 CS=0B33 IP=0102 NV UP EI PL NZ NA PO NC
0B33:0102 D0E0 SHL AL,1
-t

AX=0018 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B33 ES=0B33 SS=0B33 CS=0B33 IP=0104 OV UP EI PL NZ NA PE CY
0B33:0104 B106 MOV CL,06
-t

AX=0018 BX=0000 CX=0006 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B33 ES=0B33 SS=0B33 CS=0B33 IP=0106 OV UP EI PL NZ NA PE CY
0B33:0106 D2E0 SHL AL,CL
-t

AX=0000 BX=0000 CX=0006 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B33 ES=0B33 SS=0B33 CS=0B33 IP=0108 OV UP EI PL ZR NA PE NC
0B33:0108 58 POP AX
-t

AX=0000 BX=0000 CX=0006 DX=0000 SP=FFF0 BP=0000 SI=0000 DI=0000
DS=0B33 ES=0B33 SS=0B33 CS=0B33 IP=0109 OV UP EI PL ZR NA PE NC
0B33:0109 893EE699 MOV [99E6],DI DS:99E6=0000
-
好像结果不一致
goodider 2009-10-24
  • 打赏
  • 举报
回复
还是看看书吧上面介绍的还算清除。
desdouble 2009-10-24
  • 打赏
  • 举报
回复
需要注意的是,在执行shl al, cl时,al已经变成了00011000,而不是原来的10001100了。
desdouble 2009-10-24
  • 打赏
  • 举报
回复
shl 是逻辑左移指令。

移位指令,不管是逻辑移位,算术移位,不管是左移还是右移,在执行后,被“移”出去的位会放到标志寄存器的OF位中。

开始AL寄存器中存放的是10001100,shl执行后最左侧的"1",被“移”出去,并放到OF位中。此时,AL变成,00011000,OF置"1"。

接下来的一个shl al, cl指令是向左移al=6位。此时AL变成00000000,最后被移出去的位是"0",OF置"0"。
BAYNPU 2009-10-24
  • 打赏
  • 举报
回复
把上述指令反过来移位就看得很清楚了:
MOV AL,8CH
MOV CL,6
SHL AL,CL
SHL AL,1

加载更多回复(1)

21,459

社区成员

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

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