鱼C论坛

 找回密码
 立即注册
查看: 2695|回复: 4

[争议讨论] 对于第七章and与or的不解

[复制链接]
发表于 2011-6-19 17:12:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
先看代码
  1. assume cs:codesg,ds:datasg,ss:stacksg '实验6

  2. datasg segment

  3. db '1. display......'
  4. db '2. brows........'
  5. db '3. replace......'
  6. db '4. modify.......'

  7. datasg ends

  8. stacksg segment

  9. dw 0,0,0,0,0,0,0,0

  10. stacksg ends

  11. codesg segment

  12. start:mov ax,stacksg
  13. mov ss,ax
  14. mov sp,16

  15. mov ax,datasg
  16. mov ds,ax
  17. mov bx,0

  18. mov cx,4

  19. s0:push cx
  20. mov si,0
  21. mov cx,4

  22. s: mov al,[bx+3+si]
  23. and al,11011111b         'or al,11011111b
  24. mov [bx+3+si],al

  25. inc si
  26. loop s

  27. add bx,16
  28. pop cx
  29. loop s0

  30. mov ax,4c00h
  31. int 21h

  32. codesg ends

  33. end start
复制代码
如果按照红色的代码执行,结果出现什么呢,就是把  数据段里所有的数据全部置为........(对应的16进制为FF),何解,为什么一定必须add 就是置0  而or一定是置1呢     我想知道原理,如果按照书本字面理解,我个人觉得 add与or是通用的,但是既然他是分开讲的,为什么不讲清楚呢


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-19 18:23:35 | 显示全部楼层
0110 0010 = 在ASCII里面代表小写字母b
0100 0010 = 在ASCII里面代表大写字母B
    ↑
在上面可以看出第5位在不同,修改第5位就可以转换ASCII里面字母大小写
所以and 逻辑与,2位相同是为真,就是1,如果有一位不同就是0,假!
同理or逻辑或,有一位为真,即为真,全是假0,则为0!
比如 1   0   1   0
     and  or and or
       1   1    0   0
-------------------------
      真  真  假 假
    1    1    0   0
即直接修改第5位就OK啦
比如BX的偏移地址单元ASCII值是大写的字母A
mov al, [bx]
or al,00100000 ;
因为字母大写A的ASCII的2进制数码为
0100 0001
      or
0010 0001
--------------
0110 0001
                                                                       
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-19 18:46:09 | 显示全部楼层
呃 你的程序是正确的 我也仔细看过,而至于你的问题,首先“.............”并不是零,这个点"."的符号在内存中可能就是ff   
而 and  or  指令 的原理我想你得自己看书,还是自己研究书本来得好!
and指令:逻辑“与”     
例: mov al,01100011
       and  al,11011111
结果:    al=01000011
请注意看:上面的例  从右往左数(以后都是这样)第一个"1"和下面的and 指令里的第一个"1"同样都是"1",所以and  指令通俗一点说就是同位上如果都是”1"那么所得到的结果相应为也是"1“ ,如果一个为1,一个为0,那么结果就是0。而同时为0,那么结果也为0。
也就是说:mov al,01100011"与”and  al,11011111里面的数据要同时为1时结果相应的位才为1,否则为0

or指令:逻辑”或“指令
例: mov al,01100011
       or    al,11011111
结果:    al=11111111
这样最明显了,也就是说  只要两个数据中,同位上只要有一个是1那么结果的相应为也就是1
通俗说就是:只要mov al,01100011"或"or    al,11011111 里每个位上有一个为1话那么结果的相应位上必定为1。

希望这样说你能理解……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-20 15:59:42 | 显示全部楼层
回1楼的热心同学,你说的and与or的定义我还是明白的,谢谢你不厌其烦的再次帮我复习一次,

当然如果1楼的这位同学可以帮我调试程序第35行 and al,11011111b  把他改为 or al,11011111b 后为什么出现数据段的数据全部改为.......就更好了


再次表示感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-20 16:03:07 | 显示全部楼层
回2楼的同学,首先对你表示感谢,感谢你抽出时间帮我解答我在学习中的困惑


当然如果2楼的这位同学可以帮我调试程序第35行 and al,11011111b  把他改为 or al,11011111b 后为什么出现数据段的数据全部改为.......就更好了,这个才是我最想知道的答案


再次表示感谢



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 16:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表