王爽的《汇编语言》112页中说道:计算ffff:0--ffff:b单元中的数据的和,结果存在在dx中。
他说,ffff:0--ffff:b中的数据是8位的,不能直接加到16位的寄存器dx中。
但是前面他有过例题说:
mov ax,[0]
mov dx,[1]
mov dl,[1]
等等,
他也说过,可以这么做,将8位寄存器的内容加到16位寄存器当中去。如:
mov ax,bl;将8位寄存器赋值到16位寄存器中去
------解决方案--------------------
早期 cpu 指令不支持,原因嘛也简单,数据位长不一致啊,不能直接传送;后来的或许是考虑到这样指令的需求吧,支持了,即新增了 movsx 和 movzx 指令,但 mov ax,bl 还是不可以的,弄不清你到底想怎么着啊;至于上面的那三个指令,内存的数据是和寄存器位数一致的,这样的形式至少是被 debug 认可的,有些汇编程序也认,有些可能会给警告或错误,当然了在内存地址前得加上 ds: 前缀,否则内存地址就会被当做立即数了。
------解决方案--------------------
add r8/m8, r8/m8
add r16/m16,r16/m16
r代表寄存器,m代表内存单元,其中add不允许两个操作数都为内存单元,且两个操作数的数据宽度要一致,段寄存器不能做操作数 你的add dx,al不正确两个操作数宽度不一致
------解决方案--------------------
呃 漏了点还有可以这样 add r8/r16,idata 和 add byte ptr m8/word ptr m16,idata 操作符byte ptr和word ptr不可缺省 分别表示对8位字节单元和16位字单元进行add
------解决方案--------------------
add dx, al 这样的指令是不可以的,对不同位长的操作数,目前只支持 movzx 和 movsx 进行赋值,运算上不支持 add 之类的直接的指令。
------解决方案--------------------
是可以的 关键字要用对