8086汇编的几个问题 帮忙看下

来源:百度知道 编辑:UC知道 时间:2024/07/04 14:27:58
1.X为已经定义的字类型 Y为字节类型
MOV AX,X
MOV AL,Y
为什么不能换成:
MOV AX,Y
MOV AL,X
2.如果想交换 CS和DS 这样写对不对:
MOV AX CS
MOV DS AX
3.已知 AL=0FFH BL=1
MUL BL ;AX=0FFH(255)
IMUL BL ;AX=OFFFFH(-1)
这道题的AX是怎么算出来的 解释一下
多谢

1)X定义是字类型,就是说有16位
Y定义字节类型,就是说有8位
AX和AL其实是同一个寄存器,AX表示完整16位寄存器,而AL表示AX寄存器的低8位,所以AL只有8位。
X是16位的,自然不能放到8位寄存器中,所以MOV AL,X是错的;
MOV AL,Y没有语法错误,8位数据自然可以放进16位寄存器,只是一般不怎么用。
2)你只做DS里数据变成CS,CS并没有变。按照你的方法你可以这样
MOV AX,CS
MOV BX,DS
MOV DS,AX
MOV CS,BX
当然你也可以直接交换,用交换指令
MOV AX,CS
MOV BX,DS
XCHG AX,BX
3)MUL BL ;AX=AL*BL=0FFH(255)*01H(1)=255
(你可以去看一下MUL指令的解释。MUL 源
当源操作数为字节时,它与累加器AL中内容相乘为16位数,放在AX中;即
AX=AL*源
当源错做数为字时,它与累加器AX中内容想盛为32为数,放在(DX,AX)中
DX为高16位,AX为低16位;即(DX,AX)=AX*源)
IMUL BL;AX=AL*BL=0FFH(11111111B)*01H(00000001B)
=0FF01H(11111111 00000001B)=-1
(IMUL表示有符号数相乘,其他和MUL一样。如果搞不清楚有符号数和无符号数,还是找本书看吧,那太长了。)

1、因为换了以后两条指令的传送类型都不对了(不能8位->16位,也不能16位->8位),AX是16位的(字类型),AL是8位的(字节类型)
2、不对,你只是完成了CS->AX,然后AX->DS,也就是CS的值传送给了DS,而DS的原值丢了。
3、对于无符号数,AL=0FFh,表示255,乘上1后还是255,所以AX=00FFh
而对于有符号数,AL=0FFh,补码表示-1,乘上1后还是-1,因为乘积是16位的(AX),所以AX=0FFFFh(0FFh是8位补码表示的-1,0FFFFh是16位补码表示的-1)。