新手问一个 关于mov 赋值的问题

cscycd1 2013-07-31 04:09:38
寄存器 在赋值的时候 不是 值的 位数 和寄存器是对应的吗
1.可是为什么 会看到
mov ax,1
mov cx,5
之类的 命令
不应该写成
mov ax,0001h
mov cx,0005h
吗?
2.而且如果取出一个 内存单元
mov ax,[bx]
这样写是错的 因为 [bx]指向的单元是 xxh 格式的 而 ax是 xxxxh 格式的
所以 用
mov al,[bx]
mov ah,0;
想到这里 我有郁闷了 如果 mov ax,1成立的话 mov ax,[bx]不也应该成立吗? 而 后面的 mov ah,0 不应该写成 mov ah,00h吗?
我晕了 mov 寄存器,数据 数据的位数 应该是和 寄存器的位数相等的 可是
又可以 mov ax,0001h 又可以mov ax,1 这不就 自相矛盾了吗? 可能有些地方理解的不对 求教
...全文
625 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhctj159 2013-08-02
  • 打赏
  • 举报
回复
引用 1 楼 zara 的回复:
这个,理解的话,要从指令功能和机器码上来看。 mov ax, 1 其实就是 mov ax, 0001h 其机器码为 B8 01 00 汇编程序在理解 mov ax,1 时,会认为是将 1 赋予 ax 寄存器,所以 1 就会是个 16 位的 0001h 了。汇编程序,对立即数的理解上,会尽量和所要求的位数一样,小了的可以扩,大了的话就会出错了(比如 mov al, 1000 );如果都要求和要求的完全一致,一来看着可能会有些烦乱,二则会让些常量类的因可能需要赋予不同位长的对象而无法实行。 mov ax,[bx] 指令,照你的说法的话,就不能这么写了,因为指令要求源和目的操作数的大小一致,所以,必然是将内存 [bx] 处的 16 位数据传递给 ax 而非你说的 8 位。为避免歧义,通常还可能要求写得更为明确些如 mov ax, word ptr [bx] 或 mov al, byte ptr [bx] 。象你描述的这样的功能,后来的 cpu 也新增有个指令的 movzx ax, byte ptr [bx] 。
正解
lpcads 2013-08-02
  • 打赏
  • 举报
回复
关于1 mov ax,1 mov cx,5 1和5这种立即数,只要不溢出,编译器会自动转换为0001h和0005h 关于2 mov ax,[bx] 这条指令是错的吗?还特地在debug里试了试,没问题啊? [bx]默认指向DS段,由于ax是16位,所以该指令把DS:bx处开始的16位值送至ax。 mov al,[bx]同理,把DS:bx处的8位值送至al。 两条指令都没问题
zara 2013-07-31
  • 打赏
  • 举报
回复
这个,理解的话,要从指令功能和机器码上来看。
mov ax, 1 其实就是 mov ax, 0001h 其机器码为 B8 01 00 汇编程序在理解 mov ax,1 时,会认为是将 1 赋予 ax 寄存器,所以 1 就会是个 16 位的 0001h 了。汇编程序,对立即数的理解上,会尽量和所要求的位数一样,小了的可以扩,大了的话就会出错了(比如 mov al, 1000 );如果都要求和要求的完全一致,一来看着可能会有些烦乱,二则会让些常量类的因可能需要赋予不同位长的对象而无法实行。
mov ax,[bx] 指令,照你的说法的话,就不能这么写了,因为指令要求源和目的操作数的大小一致,所以,必然是将内存 [bx] 处的 16 位数据传递给 ax 而非你说的 8 位。为避免歧义,通常还可能要求写得更为明确些如 mov ax, word ptr [bx] 或 mov al, byte ptr [bx] 。象你描述的这样的功能,后来的 cpu 也新增有个指令的 movzx ax, byte ptr [bx] 。

21,499

社区成员

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

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