将x86汇编语言翻译成机器语言,而机器语言是写入到硬件板子上的。 具体以如下格式展示:(分号右边的是注释) 首先需要了解十五条基本指令,下面是指令的参考表 下面大致介绍一下每条指令的功能: 1、MOV是将源寄存器中的内容存放到目的寄存器中 2、ADD是将源寄存器 和目的寄存器中的内容相加存放到目的寄存器中 3、SUB是将目的寄存器中的内容和源寄存器中的内容相减存放到目的寄存器中 4、AND是将目的寄存器和源寄存器中的内容进行二进制按位与存放到目的寄存器中 5、OR是将目的寄存器和源寄存器中的内容进行二进制按位或存放到目的寄存器中 6、RR是将将RS中的内容向右循环位移一位,存档到RD中 7、INC是将RD寄存器中的内容自加一 8、 LAD是按照M的寻址方式通过地址D来访问内存,取出来的内容存放到RD中 9、STA是按照M的寻址方式将RD中的内容存放到内存D地址的位置 10、JMP是按照寻址方式M无条件跳转到D地址 11、BZC是当FC或FZ等于一时按照寻址方式M跳转到地址D对应的位置 12、IN是得到I/O端输入的内容存放到寄存器RD中 13、OUT是将寄存器RD中的内容输出到I/O端 14、LDI是将一个立即数放到RD寄存器中 15、HALT是停机指令 机器指令的注释部分就是按照助记符号来编写的。 至于$P 后面的内容下面我会介绍。 指令的格式分四种: (1)单字节指令格式(其中包括ADD、AND、INC、SUB、OR、RR、HLT和MOV) 其中RS为源寄存器,RD为目的寄存器 (2)IN和OUT的指令格式为: 其中P为I/O端口号,IN的一般为00H,OUT的一般为40H (3)LAD、STA、JMP和BZC指令格式如下: 其中M为寻址方式(四种),D为地址 (4)LDI指令格式如下: data为向寄存器中存放的数据 寻址方式参考表: 以下是寄存器的参考表: 以MOV指令为例: 它以0100开头(至于为什么之后在微指令的设计方面我会说),后面的RS和RD分别为寄存器 假设是将R0寄存器的内容存放到R1中具体的编码形式应为: 0100 00 01 以STA指令为例: 设计将R1寄存器中的内容按照直接寻址存放到内存中4FH对应的位置 STA指令是以1101开头 直接寻址方式为00 指令格式为: 1101 00 01 (要转化为十六进制) 4F 在了解了上面的内容后,就可以一点一点的将汇编语言转换为助记符指令,然后在转换机器码就可以了。 这里分享一个小小的心得,为了保证程序能够快速运行进行少用访问的指令,要充分使用寄存器。 还有就是循环loop的话可以使用jmp配合bzc来进行循环或者是条件跳转 下面分享一个我写的奇数偶数个数判断的机器码:
1 | $P 00 20 ; START:IN RO,00H |