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

新手问一个 关于mov 赋值的问题
本帖最后由 cscycd1 于 2013-07-31 16:10:26 编辑
寄存器 在赋值的时候 不是 值的 位数 和寄存器是对应的吗
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   这不就 自相矛盾了吗?   可能有些地方理解的不对   求教  

------解决方案--------------------
这个,理解的话,要从指令功能和机器码上来看。
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] 。