注册 登录
编程论坛 汇编论坛

新学汇编,问个问题

assassion123 发布于 2012-11-14 10:44, 980 次点击
sub ax,ax的机器码为2个字节
mov ax,0的机器码为3个字节
能解释下么?
7 回复
#2
zklhp2012-11-14 10:54
以下是引用assassion123在2012-11-14 10:44:23的发言:

sub ax,ax的机器码为2个字节
mov ax,0的机器码为3个字节
能解释下么?

-a
0B9F:0100 sub ax,ax
0B9F:0102 mov ax,0
0B9F:0105
-u
0B9F:0100 29C0          SUB     AX,AX
0B9F:0102 B80000        MOV     AX,0000

以上是最好的解释

为啥呢 因为这里mov ax, 0实际要和ax大小一致 所以实际是mov ax, 0000 所以反而大
#3
assassion1232012-11-15 09:41
回复 2楼 zklhp
"因为这里mov ax, 0实际要和ax大小一致 所以实际是mov ax, 0000 所以反而大"
在下愚钝,这句话不是很理解,还有是不是用"mov"时cs:ip的跳转为间隔是3,"sub"时间隔是2?

[ 本帖最后由 assassion123 于 2012-11-15 13:08 编辑 ]
#4
lyloog2012-11-15 13:20
时间间隔要看指令的而执行时间的
#5
hu9jj2012-11-15 14:24
这是CPU指令系统设计的时候确定的,指令的字节长度不完全一样,有双字节指令,也有大于双字节的指令。
sub ax,ax 是寄存器内的数据运算,所以两个字节就可以表示。
mov ax,0 是立即数与寄存器两者之间的数据运算(赋值运算),因为还需要两个字节来存放立即数0,所以指令的长度会大于2.
#6
有容就大2012-11-16 00:03
回复 5楼 hu9jj
mov al, 0呢?
#7
assassion1232012-11-16 08:33
回复 5楼 hu9jj
对啊,那为什么“mov al,0”Ip的变化是2不是3呢?
#8
小石汇编2012-11-21 18:19
红土地:这是CPU指令系统设计的时候确定的,指令的字节长度不完全一样,有双字节指令,也有大于双字节的指令。
sub ax,ax 是寄存器内的数据运算,所以两个字节就可以表示。
mov ax,0 是立即数与寄存器两者之间的数据运算(赋值运算),因为还需要两个字节来存放立即数0,所以指令的长度会大于2.
*******
ax是两个字节,从而硬性的规定了mov ax,0中的0是双字节了,
同时mov al,0的al是单字节,那么mov al,0中的0是单字节。
1