保证不打死你 发表于 2015-5-21 19:32:19

王爽 汇编 2.2 疑问

本帖最后由 保证不打死你 于 2015-5-21 23:43 编辑

大家好,我是新手,昨天刚刚学习汇编。

在王爽的2.2这章这儿,在计算的时候,有很多疑问,所以来请教各位学长。




我是这样计算的。

mov ax,001AH ax = 001AH
mov bx,0026H bx = 0040H
add al,bl al = ? //al等于多少呢?
add ah,bl ah = ?
add bh ,al = ?
mov ah,0 ah = 0000H?
add al,85H al = ?

我是这样算的? 肯定是错误的。还请各位学长指点。
mov ax,001AH ax = 001AH
mov bx,0026H bx = 0040H
add al,bl al = 005AH? bl = 0040H?
add ah,bl ah = 009AH? bl = 0040H?
add bh ,al bh = 009AH? al = 0040H?
mov ah,0 ah = 0000H?
add al,85H al = ?

因为之前学的是VC,有些不明白的是,AL 和BL 数据都没有定义啊? 而直接相加,那该怎么算呢?

因为是刚学,寄存器这些都没搞清楚。

为什么相加,哪些要抛弃,哪些不抛弃呢?

而且al,ah,这些都没定义数据,那直接mov或者相加,数据从哪儿来的呢?

还请各位学长指点,谢谢。刚学的小菜鸟。

零度非安全 发表于 2015-5-21 21:55:18

本帖最后由 零度非安全 于 2015-5-21 22:01 编辑

楼主你好,对于你的问题,我想说的如下:
首先书中已经说明了原AX=0000H,BX=0000H,在书中第17面的下面给出了AX和BX的初值,只不过这是另外的一个例子mov ax,001AH
执行后:AX=001AHBX=0000H


mov bx,0026H
执行后:AX=001AHBX=0026H(至于楼主你那个0040H怎么得到的呢?{:9_241:})
add al,bl
首先8086的寄存器是16位的,它所存放的数据也是16位,又因为8086上一代的CPU是8位的,在那个年代,为了兼容上一代的CPU所运行的程序,所以在后来更为先进的8086的16位寄存器可以把它看作是两个独立的8位寄存器,如下图:


所以初始时AL=1AH,BL=26H,都是存放各自的低8位的数据,执行后:AL=40HBL中的值不变,还是26H则此时AX=0040H,BX=0026H

add ah,bl
初始状态AX=0040H,BX=0026H   则此时AH=00H,BL=26H
执行后:AH=26H,BL的值还是不变,即BL=26H
此时AX=2640H,BX=0026H

add bh,al
初始状态AX=2640H,BX=0026H   则此时AL=40H,BH=00H
执行后:BH=40H,AL中的值不变,为40H
此时AX=2640H,BX=4026H

mov ah,0
初始状态AX=2640H,BX=4026H则此时AH=26H
执行后:0覆盖了AH中的值,所以AH=00H
此时AX=0040HBX中的值不变,为4026H

add al,85H
初始状态AX=0040H,BX=4026H则此时AL=40H
执行后:AL=C5H
此时AX=00C5H   BX中的值不变,为4026H

add al,93H
初始状态AX=00C5H,BX=4026H则此时AL=C5H
执行后:AL=158H,但是AL是一个8位的寄存器,它只能存放8位的数据,所以最高位的1“舍去”,所以最后AL=58H,这里的舍去带双引号,并不是CPU真正的舍去,也正如楼主所说的抛弃,CPU是不会抛弃的,其实它会把那个数字1用另外的寄存器来存放,在这里就不多说了
此时AX=0058H   BX中的值不变,为4026H
对于楼主所说的al,ah没有定义数据,其实在表的前面已经说明了AX和BX中的初值为0000H了

以上我已经把全部过程给你分析了一遍(纯手打),希望楼主能弄明白
凡是做任何事都需要慢慢来,切忌不要急躁!!!嘻嘻{:9_217:}

最后希望楼主以后能多加油,多来鱼C论坛逛逛哈!!!{:9_231:}







保证不打死你 发表于 2015-5-21 21:15:39

谢谢各位,我已经在用DEBUG在学着计算了。一会我把我的答案贴上来。和自己的分析。

保证不打死你 发表于 2015-5-21 21:27:46

这个是我刚才计算的答案,虽然对了一部分,但是还是有一部分没搞明白。还请大家在指点一下。

为什么那儿和我算的不一样呢?


mov ax,001AH AX = 001AH BX = 0000H
mov bx,0026H Ax = 001AH BX = 0026H
add al,bl AX = 0040H BX = 0026H //AL是第八位寄存器,Bl也是。 用以上BX + AX = 0040H
add ah,bl ax = 为什么这儿等于2640? 不是0040 + 0026吗BX = 0026H
add bh,al ax = 2640H bx = ? 为什么这儿bx等于4026H? 不是这样运算的吗? 2640H + 0026H?
mov ah,0 ax =?为什么这儿又等于0040H?
add al,85Hax = 00c5H BX = 4026H (85H + ax(0040H) == 00c5H)
add al,93H ax = 0058H (因为al是低八位寄存器,所以最高位丢失)

保证不打死你 发表于 2015-5-21 22:21:11

零度非安全 发表于 2015-5-21 21:55
本帖最后由 零度非安全 于 2015-5-21 22:01 编辑
楼主你好,对于你的问题,我想说的如下:
首先书中已经 ...

非常感谢,感谢感谢。我肯定会很好的支持论坛。等我在进步点,我就:两包烟的钱,把不了妹买不了田,不如拿来支持小甲鱼推出更多原创教学视频!真的很感谢你。

保证不打死你 发表于 2015-5-21 22:38:27

本帖最后由 保证不打死你 于 2015-5-21 22:41 编辑

零度非安全 发表于 2015-5-21 21:55
本帖最后由 零度非安全 于 2015-5-21 22:01 编辑
楼主你好,对于你的问题,我想说的如下:
首先书中已经 ...
你好,学长。看着学长帮忙的分析。我开阔了不少。但是还有一个计算的问题,还请学长在帮忙一次。

mov ax,001AH ;AX= 001AH ; AX是16位通用寄存器
mov bx,0026H ; BX = 0026H ; BX也是16位通用寄存器
add al,bl; AX = 001AH + 0026H =0040H.因为AL是低八位的寄存器,所以这儿等于0040H
将0040H换成2进制如下,
7 6 5 4 3 2 1 0
1 0      0 0 0 0 0 0
(也就是说,如果这儿在多出一位,也就是得舍弃掉了)

add ah,bl
初始状态AX=0040H,BX=0026H   则此时AH=00H,BL=26H
执行后:AH=26H,BL的值还是不变,即BL=26H //这儿我还能理解,BL为低八位,所以值还是没变
此时AX=2640H,BX=0026H //我不明白的是这儿,为什么相加后,AX的值为2640H了。该是怎么算的呢?此时就是BL(低八位)+ AH(高八位相加)。 想了好久,不知道为什么结果会得到2640?

保证不打死你 发表于 2015-5-21 23:03:06

本帖最后由 保证不打死你 于 2015-5-21 23:04 编辑

零度非安全 发表于 2015-5-21 21:55
本帖最后由 零度非安全 于 2015-5-21 22:01 编辑
楼主你好,对于你的问题,我想说的如下:
首先书中已经 ...
我想我又明白一点了,低8位和高8位相加,无法直接进行相加。因为一个是在低位,一个是在高位。

所以这儿2460,是

AX=0040
BX=0026

而这里的BL是低位,就应该放在低位,也就是

BL 2进制代码如下:

76543210
00011001

而AH是高八位,如下

76543210
00000001

所以直接是把BL 26加低位,而高位不变,40H.

就成了2640H ,请问是这样吗? 我在仔细看看。谢谢。

零度非安全 发表于 2015-5-21 23:07:59

AL中的40H换成二进制为:             AL
76543210
01000000


这里并没有多出一位


add ah,bl
根据楼主的描述,估计你是不理解一个寄存器的高8位和另一个寄存器的低8位中的二进制数据怎么进行相加吧!
(这个指令的意思是将ah和bl中的数据相加,最后把相加后得到的新数据存放在ah中,原来ah中的数据会被新的数据覆盖,而bl中的值并没有改变,依然是26H)


ah就变成了26H


关于怎么相加,你就理解成简单的进行数字的加法运算










保证不打死你 发表于 2015-5-21 23:23:59

零度非安全 发表于 2015-5-21 23:07
AL中的40H换成二进制为:            AL
76543210
01000000

你好,学长,这个是我刚才看着你的文字,又重新理解的。请看一下是否正确。

mov ax,001AH ax = 001AH; 将1AH 移动到ax中,值为001AH,ax为16位通用寄存器。所以得到的值为001AH
mov bx,0026H bx = 0026H; 将0026H 移动到BX中,BX为16位通用寄存器。

add al,bl al = 0040H BL = 0026H;将bl + al = (26 + 1A) AX = 0040H; AL,bl都是低8位

add ah,bl ax = 2640H BL = 0026H;bl值为40,属于低八位,而aH属于高8位,不能直接相加,所以得到的结果是 低:26 高 40 .所以是2640

add bh,al bh = 4026H AL = 2640H;al = 40H,bh 是高八位,所以排序如下: 高:26 低:40,所以是4026

mov ah,0 ax = 0040H ;将0移动到高位的ah中,而AX现在等于2640,移动0过去后,就成了0040H

add al,85H al = 00c5H;al = 0040H + 85H = 00c5H

add al,93H al = 0058H;0093H + 00c5H = 0158H,但是这儿的是第八位,所以0就暂时性舍弃了。
而且我都计算出来了。通过自己的理解。请问理解的对吗?

保证不打死你 发表于 2015-5-21 23:42:52

零度非安全 发表于 2015-5-21 23:07
AL中的40H换成二进制为:            AL
76543210
01000000


第4步的指令是ADD AH, BL
将BL中的26H与 AH中的00H相加,结果26H存入AH中。
因而执行以后的状态变成了AH=26H, AL仍是原来的40H不变,所以,AX=2640H

谢谢。已经解决了。

保证不打死你 发表于 2015-5-22 09:40:07

零度非安全 发表于 2015-5-22 08:09
由于昨天晚上我正在写的时候,突然间断网了,所以昨天半夜没回复




大半夜的,真是辛苦你啦。

我在回过头去看看来。昨晚相对理解了这个以后,我把第二章的题都能不看书本,对照答案做了 哈哈。

桃花飞舞 发表于 2015-5-22 22:37:02

楼主用的什么编译器好用吗?我也刚开始看

保证不打死你 发表于 2015-5-22 22:59:35

桃花飞舞 发表于 2015-5-22 22:37
楼主用的什么编译器好用吗?我也刚开始看

我用的NOTEPAD++,你留下QQ。咋俩一块儿学习把。

mrjliu 发表于 2015-5-24 17:00:16

急用鱼币,我刷点勿怪

大米可爱多 发表于 2017-1-28 18:05:50

自己想了一下午,看完楼主的帖子突然豁然开朗,对于初学者帮助很大谢谢楼主的解答,还要坚持学些

大米可爱多 发表于 2017-1-28 18:08:00

零度非安全 发表于 2015-5-21 21:55
本帖最后由 零度非安全 于 2015-5-21 22:01 编辑
楼主你好,对于你的问题,我想说的如下:
首先书中已经 ...

谢谢楼主解答,看完之后豁然开朗,懂了其中的意思了{:5_95:}
页: [1]
查看完整版本: 王爽 汇编 2.2 疑问