|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 保证不打死你 于 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 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位寄存器,如下图:
所以初始时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论坛逛逛哈!!!
|
|