为什么内存中8位数据不能加到16位的通用寄存器?

「已注销」
博客专家认证
2014-04-16 12:54:02
王爽的《汇编语言》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位寄存器中去
...全文
838 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly 100% 2014-04-17
  • 打赏
  • 举报
回复
是可以的 关键字要用对
zara 2014-04-17
  • 打赏
  • 举报
回复
add dx, al 这样的指令是不可以的,对不同位长的操作数,目前只支持 movzx 和 movsx 进行赋值,运算上不支持 add 之类的直接的指令。
yuexicheng 2014-04-17
  • 打赏
  • 举报
回复
呃 漏了点还有可以这样 add r8/r16,idata 和 add byte ptr m8/word ptr m16,idata 操作符byte ptr和word ptr不可缺省 分别表示对8位字节单元和16位字单元进行add
yuexicheng 2014-04-17
  • 打赏
  • 举报
回复
add r8/m8, r8/m8 add r16/m16,r16/m16 r代表寄存器,m代表内存单元,其中add不允许两个操作数都为内存单元,且两个操作数的数据宽度要一致,段寄存器不能做操作数 你的add dx,al不正确两个操作数宽度不一致
「已注销」 2014-04-16
  • 打赏
  • 举报
回复
引用 1 楼 zara 的回复:
早期 cpu 指令不支持,原因嘛也简单,数据位长不一致啊,不能直接传送;后来的或许是考虑到这样指令的需求吧,支持了,即新增了 movsx 和 movzx 指令,但 mov ax,bl 还是不可以的,弄不清你到底想怎么着啊;至于上面的那三个指令,内存的数据是和寄存器位数一致的,这样的形式至少是被 debug 认可的,有些汇编程序也认,有些可能会给警告或错误,当然了在内存地址前得加上 ds: 前缀,否则内存地址就会被当做立即数了。
可以这样写代码么?
assume cs:codesg
codesg segment
	mov ax,0ffffh
	mov ds,ax
	mov cx,0bh;
	mov bx,0
	mov ax,0
	mov dx,0
	
  s:mov al,[bx]
	add dx,al
	inc bx
	loop s

	mov ax,4c00h
	int 21h
	
codesg ends
end
zara 2014-04-16
  • 打赏
  • 举报
回复
早期 cpu 指令不支持,原因嘛也简单,数据位长不一致啊,不能直接传送;后来的或许是考虑到这样指令的需求吧,支持了,即新增了 movsx 和 movzx 指令,但 mov ax,bl 还是不可以的,弄不清你到底想怎么着啊;至于上面的那三个指令,内存的数据是和寄存器位数一致的,这样的形式至少是被 debug 认可的,有些汇编程序也认,有些可能会给警告或错误,当然了在内存地址前得加上 ds: 前缀,否则内存地址就会被当做立即数了。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧