对于第七章and与or的不解
先看代码assume cs:codesg,ds:datasg,ss:stacksg '实验6
datasg segment
db '1. display......'
db '2. brows........'
db '3. replace......'
db '4. modify.......'
datasg ends
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends
codesg segment
start:mov ax,stacksg
mov ss,ax
mov sp,16
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,4
s0:push cx
mov si,0
mov cx,4
s: mov al,
and al,11011111b 'or al,11011111b
mov ,al
inc si
loop s
add bx,16
pop cx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
如果按照红色的代码执行,结果出现什么呢,就是把数据段里所有的数据全部置为........(对应的16进制为FF),何解,为什么一定必须add 就是置0而or一定是置1呢 我想知道原理,如果按照书本字面理解,我个人觉得 add与or是通用的,但是既然他是分开讲的,为什么不讲清楚呢
0110 0010 = 在ASCII里面代表小写字母b
0100 0010 = 在ASCII里面代表大写字母B
↑
在上面可以看出第5位在不同,修改第5位就可以转换ASCII里面字母大小写
所以and 逻辑与,2位相同是为真,就是1,如果有一位不同就是0,假!
同理or逻辑或,有一位为真,即为真,全是假0,则为0!
比如 1 0 1 0
andor and or
1 1 0 0
-------------------------
真真假 假
1 1 0 0
即直接修改第5位就OK啦
比如BX的偏移地址单元ASCII值是大写的字母A
mov al,
or al,00100000 ;
因为字母大写A的ASCII的2进制数码为
0100 0001
or
0010 0001
--------------
0110 0001
呃 你的程序是正确的 我也仔细看过,而至于你的问题,首先“.............”并不是零,这个点"."的符号在内存中可能就是ff
而 andor指令 的原理我想你得自己看书,还是自己研究书本来得好!
and指令:逻辑“与”
例: mov al,01100011
andal,11011111
结果: al=01000011
请注意看:上面的例从右往左数(以后都是这样)第一个"1"和下面的and 指令里的第一个"1"同样都是"1",所以and指令通俗一点说就是同位上如果都是”1"那么所得到的结果相应为也是"1“ ,如果一个为1,一个为0,那么结果就是0。而同时为0,那么结果也为0。
也就是说:mov al,01100011"与”andal,11011111里面的数据要同时为1时结果相应的位才为1,否则为0
or指令:逻辑”或“指令
例: mov al,01100011
or al,11011111
结果: al=11111111
这样最明显了,也就是说只要两个数据中,同位上只要有一个是1那么结果的相应为也就是1
通俗说就是:只要mov al,01100011"或"or al,11011111 里每个位上有一个为1话那么结果的相应位上必定为1。
希望这样说你能理解…… 回1楼的热心同学,你说的and与or的定义我还是明白的,谢谢你不厌其烦的再次帮我复习一次,
当然如果1楼的这位同学可以帮我调试程序第35行 and al,11011111b把他改为 or al,11011111b 后为什么出现数据段的数据全部改为.......就更好了
再次表示感谢 回2楼的同学,首先对你表示感谢,感谢你抽出时间帮我解答我在学习中的困惑
当然如果2楼的这位同学可以帮我调试程序第35行 and al,11011111b把他改为 or al,11011111b 后为什么出现数据段的数据全部改为.......就更好了,这个才是我最想知道的答案
再次表示感谢
页:
[1]