鱼C论坛

 找回密码
 立即注册
查看: 3485|回复: 15

[已解决]王爽 汇编 2.2 疑问

[复制链接]
发表于 2015-5-21 19:32:19 | 显示全部楼层 |阅读模式

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

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

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

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

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

1.png


我是这样计算的。

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=001AH  BX=0000H


mov bx,0026H
执行后:AX=001AH  BX=0026H(至于楼主你那个0040H怎么得到的呢?)

add al,bl
首先8086的寄存器是16位的,它所存放的数据也是16位,又因为8086上一代的CPU是8位的,在那个年代,为了兼容上一代的CPU所运行的程序,所以在后来更为先进的8086的16位寄存器可以把它看作是两个独立的8位寄存器,如下图:
捕获.PNG

所以初始时AL=1AH,BL=26H,都是存放各自的低8位的数据,执行后:AL=40H  BL中的值不变,还是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=0040H  BX中的值不变,为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了

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

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







想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-5-21 21:55:18 | 显示全部楼层    本楼为最佳答案   
本帖最后由 零度非安全 于 2015-5-21 22:01 编辑
楼主你好,对于你的问题,我想说的如下:
首先书中已经说明了原AX=0000H,BX=0000H,在书中第17面的下面给出了AX和BX的初值,只不过这是另外的一个例子
mov ax,001AH
执行后:AX=001AH  BX=0000H


mov bx,0026H
执行后:AX=001AH  BX=0026H(至于楼主你那个0040H怎么得到的呢?)

add al,bl
首先8086的寄存器是16位的,它所存放的数据也是16位,又因为8086上一代的CPU是8位的,在那个年代,为了兼容上一代的CPU所运行的程序,所以在后来更为先进的8086的16位寄存器可以把它看作是两个独立的8位寄存器,如下图:
捕获.PNG

所以初始时AL=1AH,BL=26H,都是存放各自的低8位的数据,执行后:AL=40H  BL中的值不变,还是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=0040H  BX中的值不变,为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了

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

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







评分

参与人数 2荣誉 +16 鱼币 +16 贡献 +10 收起 理由
拈花小仙 + 8 + 8 + 5 热爱鱼C^_^
freeparty + 8 + 8 + 5 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

 楼主| 发表于 2015-5-21 21:15:39 | 显示全部楼层
谢谢各位,我已经在用DEBUG在学着计算了。一会我把我的答案贴上来。和自己的分析。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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,85H  ax = 00c5H BX = 4026H (85H + ax(0040H) == 00c5H)
add al,93H ax = 0058H (因为al是低八位寄存器,所以最高位丢失)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

评分

参与人数 1鱼币 +5 收起 理由
零度非安全 + 5 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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 ,请问是这样吗? 我在仔细看看。谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-21 23:07:59 | 显示全部楼层
AL中的40H换成二进制为:             AL
7  6  5  4  3  2  1  0
0  1  0  0  0  0  0  0


这里并没有多出一位


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


ah就变成了26H


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










评分

参与人数 1荣誉 +7 鱼币 +7 贡献 +5 收起 理由
拈花小仙 + 7 + 7 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-21 23:23:59 | 显示全部楼层
零度非安全 发表于 2015-5-21 23:07
AL中的40H换成二进制为:              AL
7  6  5  4  3  2  1  0
0  1  0  0  0  0  0  0

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

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就暂时性舍弃了。
而且我都计算出来了。通过自己的理解。请问理解的对吗?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-21 23:42:52 | 显示全部楼层
零度非安全 发表于 2015-5-21 23:07
AL中的40H换成二进制为:              AL
7  6  5  4  3  2  1  0
0  1  0  0  0  0  0  0

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

谢谢。已经解决了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

我在回过头去看看来。昨晚相对理解了这个以后,我把第二章的题都能不看书本,对照答案做了 哈哈。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-22 22:37:02 | 显示全部楼层
楼主用的什么编译器好用吗?我也刚开始看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-22 22:59:35 | 显示全部楼层
桃花飞舞 发表于 2015-5-22 22:37
楼主用的什么编译器好用吗?我也刚开始看

我用的NOTEPAD++,你留下QQ。咋俩一块儿学习把。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-24 17:00:16 | 显示全部楼层
急用鱼币,我刷点勿怪
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-28 18:05:50 | 显示全部楼层
自己想了一下午,看完楼主的帖子突然豁然开朗,对于初学者帮助很大谢谢楼主的解答,还要坚持学些
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢楼主解答,看完之后豁然开朗,懂了其中的意思了

评分

参与人数 1鱼币 +5 收起 理由
零度非安全 + 5 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-25 12:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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