Jum*_*ual 4 binary assembly binaryfiles opcode offset
我试图将原始机器代码字节写为0和1到文本文件中,并通过BIOS执行它.
然而,我有一些问题需要理解寻址,乘法,偏移,寻址,操作数和指令在组合安排中的作用,即MOV AL, 07
和之间的区别MOV BL, AL
.
我的意思是它在Assembly中是有意义的,但在机器代码中,获取参数的想法变得非常困难.
所以我想知道的是:我怎样才能更好地理解这一点?我发现没有教程可以准确地解释/描述组合相关中的指令或数据传递,MMIO,寻址模式,算术等之间的连接中的0和1.
在这个网站http://ref.x86asm.net/coder32.html#x00它尝试,但我不明白这一点.
示例:假设我想将5移入AL ...我是否将二进制文件中的文字'5'指定为使用AL/MOV指令链接的二进制前缀中的操作码的一部分,或者我是否每个都有一个固定的二进制代码教学,无论价值多少?这就是我想知道的...如何解释如何编写机器代码.
不幸的是,x86编码很复杂且不规则,理解它很难.编码的最佳"快速入门"是sandpile.org上的一组HTML页面(它很简洁,但非常彻底).
首先:http://sandpile.org/x86/opc_enc.htm - "指令编码"表显示了十几种编码指令的方式.每行中的白色单元表示指令中的必需字节; 基于操作码中较早出现的各种字段,存在(或不存在)以下灰色单元格.您应该查看以白色"0Fh"开头的行以及第一行.在同一页面的底部是各种"扩展"操作码字段中出现的位域 - 你忽略了除"modrm/sib"行(第一行)之外的所有字段.
请注意,对于除第一行(即1字节操作码)之外的所有行,"mod r/m"字节必须遵循操作码(对于1字节操作码,它取决于指令).这对大多数2参数指令的参数进行编码.http://sandpile.org/x86/opc_rm.htm上的表具有以下含义:其中一个参数必须是寄存器,另一个参数可以是寄存器或内存间接("reg"字段对寄存器进行编码, "mod"和"r/m"字段编码另一个参数).操作码中的其他地方通常还有一个"方向"位,表示参数的顺序.操作码还指示我们是否正在操作,例如AL,AX,EAX或RAX(即不同大小),或者扩展寄存器之一,
在modrm中,如果"mod"位是"11",则"r/m"字段也指寄存器.否则,它通常是指通过将命名寄存器添加到modrm字节后出现的(可选)位移而构造的存储器地址(此常量长度为0,1或4个字节,具体取决于"mod"位).例外情况是"r/m"位为"100"(即0x4),通常命名为"SP" - 在这种情况下,内存参数由紧跟在modrm字节之后的附加"sib"字节描述(任何modrm位移出现在同胞之后).有关SIB的编码,请查看http://sandpile.org/x86/opc_sib.htm,或从modrm页面单击.
最后,要了解方向和大小的来源,请查看一些操作码:http://sandpile.org/x86/opc_1.htm.前四个条目都是"ADD",参数有两个不同的顺序,并且有两个不同的宽度.因此在这种情况下,指令的底部位编码方向和宽度.
归档时间: |
|
查看次数: |
3617 次 |
最近记录: |