又是一个小问题。。。

时间:2021-04-22 17:36:15
谁能否告之:
怎么将mov ax,3064 转换成机器代码b86430h
逐位分析,谢谢
如果能给出相应扩展知识更好。

27 个解决方案

#1


建议楼主去http://www.luocong.com/学习OpCode

#2


得不到这结果,依旧!

#3


可以啊,先用A命令,在用U命令就OK了

#4


它包括操作码和操作数
前部分是操作码然后接着是操作数类型(在寄存器或是在内存) ,再后就是操作数宽度(8位或16位) ,还有数据传送方向(r->m或m->r或m->m或r->r)...
机器码相应位上显示出这些信息
逐位分析今天不行啦,机房管理员发话要下机了改天吧,呵呵~~~

#5


我就等楼上是怎么分析的。偶也分析过了,而且是读了intel ia32之后。没有得到结果,所以来问,不知道自己哪里想的不对,请多指点。

#6


无人能答么?

#7


你可以多写一些类似的指令,然后反汇编一下,自己总结一下规律,不行吗?
一般mov ax, 之类是b8 后面是操作数
mov bx, 是bb ,后面是操作数
自己总结吧

#8


在一般的指令操作中机器码包括操作码和操作数.作码后跟着操作的宽度 操作数的寻址方式等属性信息.
说说mov ax,3064 先:  
这个语句生成的机器码包括操作码mov和操作数3064,以及相关的操作属性.
mov的机器码是100010(二进制),目地操作数是寄存器,则在操作码后跟着一个1(否则是0),这时变成1000101. 操作数3064的数据宽度是16位则又跟着一个1(如果是8位的话则是0),这时变成10001011.由于这是立即数寻址其它一些属性标志就不用了.最后跟着操作数11000001100100(3064H化成二进制),这就形成mov ax,3064 的完整机器码:100010110011000001100100
好了再把它化成十六制形式:8B3064
在内存中数据的存放是逆向的,也就是说从高地址向低址存放的,于是把它转过来就成为B86430了
----------------------------
以上就是汇编指令mov ax,3064的机器码分析,有不对之处请大家指出.

#9


8b? b8?

#10


编译成机器码时就8b,在内存中直接看就是b8了

#11


???
不可思议

#12


?请赐教

#13


8b怎样看做b8

#14


立即数传送到寄存器编码是:
1011 w reg  立即数
w   1位,指明数据是字节(=0)还是字(=1)(或双字,32位段)
reg 3位,通用寄存器说明符, ax 是 000 (w=1),
因此,mov ax,3064 的机器码是:
1011 1 000 即 b8,加上操作数 3064h,
整个指令的机器码是:b8 64 30 (x86规定低字节在前)



#15


不知道楼上有没有忘了方向位:d ,而且通常op占3位或者6位,在偶读过intel ia32 之后对照相应的表得到mov ax,3064的机器码是c76430h。而我把指令在机器上反汇编得到的是b8,郁闷!

#16


mov ax,3064 实际有两种编码方式,
一种是如上描述的3字节编码 (b8 64 30),
还有一种是4字节编码(c7 c0 64 30),此种编码才有所谓方向位,
但不论是从时间还是空间考虑,3字节编码均有优势,
因此,一般编译器均使用3字节编码

#17


另外,
并不是所有指令都有什么方向位,
象此类有立即数的传送指令,只能立即数传送给寄存器/存储器,
难道可以反向传送吗?

#18


88 /r             MOV r/m8,r8              Move r8 to r/m8
89 /r             MOV r/m16,r16            Move r16 to r/m16
89 /r             MOV r/m32,r32            Move r32 to r/m32
8A /r             MOV r8,r/m8              Move r/m8 to r8
8B /r             MOV r16,r/m16            Move r/m16 to r16
8B /r             MOV r32,r/m32            Move r/m32 to r32
8C /r             MOV r/m16,Sreg**         Move segment register to r/m16
8E /r             MOV Sreg,r/m16**         Move r/m16 to segment register
A0                MOV AL,moffs8*           Move byte at (seg:offset) to AL
A1                MOV AX,moffs16*          Move word at (seg:offset) to AX
A1                MOV EAX,moffs32*         Move doubleword at (seg:offset) to EAX
A2                MOV moffs8*,AL           Move AL to (seg:offset)
A3                MOV moffs16*,AX          Move AX to (seg:offset)
A3                MOV moffs32*,EAX         Move EAX to (seg:offset)
B0+ rb            MOV r8,imm8              Move imm8 to r8

B8+ rw            MOV r16,imm16            Move imm16 to r16

B8+ rd            MOV r32,imm32            Move imm32 to r32
C6 /0             MOV r/m8,imm8            Move imm8 to r/m8
C7 /0             MOV r/m16,imm16          Move imm16 to r/m16
C7 /0             MOV r/m32,imm32          Move imm32 to r/m32

#19


哎,同意 csdsjkk() 兄观点。。。

楼上用错操作码,字节是不需要反着存放的。

#20


csdsjkk(),从何处能查得mov的机器代码是1011?

#21


另外,不知道fanxero(方舟二号)的mov表从何而得

#22


IA-32 Intel Architecture Software Developer Manual Volume 2 : Instruction Set Reference

mov的机器码不总是1011,还和操作数有关

#23


用二进制编辑器打开*.exe或者*.com分析嘛.
不过可以肯定的是----看不懂

#24


mov的机器码不总是1011,还和操作数有关
很久以前就知道了的
问题是,如果要你来用机器代码写一段类似mov ax,3064的汇编语言,不知你该从何着手呢???
首先我们是不是要找mov的指令是什么,然后来写w,reg,immx位
问题又来了,哪里去找这个相应mov的指令呢??
(偶尚未在intel ia32中看到mov由1011来表示的,疑惑)

#25


你是不是想写编译器啊?
汇编码转机器码是汇编程序的事
我觉得你要真用机器语言写的话照IA-32手册应该可以写出来的,看你的操作码是哪个还有你的操作数是什么再照 csdsjkk() (★★)的解释做就可以了 。
(真是手动编译啊~~)
我可以给你一份IA-32手册(MHTML文档)

#26


IA-32手册?thanks,would you like send to :cxq2551017@163.com

#27


My pleasure.
May it's not as you have thought.It's only a simple sheet on which there are Intel Pentium Instruction Set Reference including Pentium 4,part of all.

#1


建议楼主去http://www.luocong.com/学习OpCode

#2


得不到这结果,依旧!

#3


可以啊,先用A命令,在用U命令就OK了

#4


它包括操作码和操作数
前部分是操作码然后接着是操作数类型(在寄存器或是在内存) ,再后就是操作数宽度(8位或16位) ,还有数据传送方向(r->m或m->r或m->m或r->r)...
机器码相应位上显示出这些信息
逐位分析今天不行啦,机房管理员发话要下机了改天吧,呵呵~~~

#5


我就等楼上是怎么分析的。偶也分析过了,而且是读了intel ia32之后。没有得到结果,所以来问,不知道自己哪里想的不对,请多指点。

#6


无人能答么?

#7


你可以多写一些类似的指令,然后反汇编一下,自己总结一下规律,不行吗?
一般mov ax, 之类是b8 后面是操作数
mov bx, 是bb ,后面是操作数
自己总结吧

#8


在一般的指令操作中机器码包括操作码和操作数.作码后跟着操作的宽度 操作数的寻址方式等属性信息.
说说mov ax,3064 先:  
这个语句生成的机器码包括操作码mov和操作数3064,以及相关的操作属性.
mov的机器码是100010(二进制),目地操作数是寄存器,则在操作码后跟着一个1(否则是0),这时变成1000101. 操作数3064的数据宽度是16位则又跟着一个1(如果是8位的话则是0),这时变成10001011.由于这是立即数寻址其它一些属性标志就不用了.最后跟着操作数11000001100100(3064H化成二进制),这就形成mov ax,3064 的完整机器码:100010110011000001100100
好了再把它化成十六制形式:8B3064
在内存中数据的存放是逆向的,也就是说从高地址向低址存放的,于是把它转过来就成为B86430了
----------------------------
以上就是汇编指令mov ax,3064的机器码分析,有不对之处请大家指出.

#9


8b? b8?

#10


编译成机器码时就8b,在内存中直接看就是b8了

#11


???
不可思议

#12


?请赐教

#13


8b怎样看做b8

#14


立即数传送到寄存器编码是:
1011 w reg  立即数
w   1位,指明数据是字节(=0)还是字(=1)(或双字,32位段)
reg 3位,通用寄存器说明符, ax 是 000 (w=1),
因此,mov ax,3064 的机器码是:
1011 1 000 即 b8,加上操作数 3064h,
整个指令的机器码是:b8 64 30 (x86规定低字节在前)



#15


不知道楼上有没有忘了方向位:d ,而且通常op占3位或者6位,在偶读过intel ia32 之后对照相应的表得到mov ax,3064的机器码是c76430h。而我把指令在机器上反汇编得到的是b8,郁闷!

#16


mov ax,3064 实际有两种编码方式,
一种是如上描述的3字节编码 (b8 64 30),
还有一种是4字节编码(c7 c0 64 30),此种编码才有所谓方向位,
但不论是从时间还是空间考虑,3字节编码均有优势,
因此,一般编译器均使用3字节编码

#17


另外,
并不是所有指令都有什么方向位,
象此类有立即数的传送指令,只能立即数传送给寄存器/存储器,
难道可以反向传送吗?

#18


88 /r             MOV r/m8,r8              Move r8 to r/m8
89 /r             MOV r/m16,r16            Move r16 to r/m16
89 /r             MOV r/m32,r32            Move r32 to r/m32
8A /r             MOV r8,r/m8              Move r/m8 to r8
8B /r             MOV r16,r/m16            Move r/m16 to r16
8B /r             MOV r32,r/m32            Move r/m32 to r32
8C /r             MOV r/m16,Sreg**         Move segment register to r/m16
8E /r             MOV Sreg,r/m16**         Move r/m16 to segment register
A0                MOV AL,moffs8*           Move byte at (seg:offset) to AL
A1                MOV AX,moffs16*          Move word at (seg:offset) to AX
A1                MOV EAX,moffs32*         Move doubleword at (seg:offset) to EAX
A2                MOV moffs8*,AL           Move AL to (seg:offset)
A3                MOV moffs16*,AX          Move AX to (seg:offset)
A3                MOV moffs32*,EAX         Move EAX to (seg:offset)
B0+ rb            MOV r8,imm8              Move imm8 to r8

B8+ rw            MOV r16,imm16            Move imm16 to r16

B8+ rd            MOV r32,imm32            Move imm32 to r32
C6 /0             MOV r/m8,imm8            Move imm8 to r/m8
C7 /0             MOV r/m16,imm16          Move imm16 to r/m16
C7 /0             MOV r/m32,imm32          Move imm32 to r/m32

#19


哎,同意 csdsjkk() 兄观点。。。

楼上用错操作码,字节是不需要反着存放的。

#20


csdsjkk(),从何处能查得mov的机器代码是1011?

#21


另外,不知道fanxero(方舟二号)的mov表从何而得

#22


IA-32 Intel Architecture Software Developer Manual Volume 2 : Instruction Set Reference

mov的机器码不总是1011,还和操作数有关

#23


用二进制编辑器打开*.exe或者*.com分析嘛.
不过可以肯定的是----看不懂

#24


mov的机器码不总是1011,还和操作数有关
很久以前就知道了的
问题是,如果要你来用机器代码写一段类似mov ax,3064的汇编语言,不知你该从何着手呢???
首先我们是不是要找mov的指令是什么,然后来写w,reg,immx位
问题又来了,哪里去找这个相应mov的指令呢??
(偶尚未在intel ia32中看到mov由1011来表示的,疑惑)

#25


你是不是想写编译器啊?
汇编码转机器码是汇编程序的事
我觉得你要真用机器语言写的话照IA-32手册应该可以写出来的,看你的操作码是哪个还有你的操作数是什么再照 csdsjkk() (★★)的解释做就可以了 。
(真是手动编译啊~~)
我可以给你一份IA-32手册(MHTML文档)

#26


IA-32手册?thanks,would you like send to :cxq2551017@163.com

#27


My pleasure.
May it's not as you have thought.It's only a simple sheet on which there are Intel Pentium Instruction Set Reference including Pentium 4,part of all.