汇编指令与机器码
汇编语言
汇编语言汇编语言实质上是机器语言的符号表示,即用助记符(指令功能的英文缩写)代替了机器语言指令的二进制代码。
用汇编语言按着规定的语法规则编写的程序称为汇编语言源程序(*.asm)。
汇编语言源程序中的汇编指令与指令的机器码(目标代码)是一一对应的。
汇编语言2高级语言是面向过程的语言,它不依赖于特定的机器,独立于机器,高级语言编写的程序由一系列编程语句和相应的语法规则构成,编程方法更适合于人们的思维习惯,易于理解和阅读,程序本身具有可移植性,通用性强高级语言的缺点是编译程序和解释程序复杂,占用内存空间大,与汇编语言程序相比,经编译后产生的目标程序长,执行速度慢高级语言3汇编语言上机处理过程4汇编语言汇编语言的程序格式伪指令程序设计基本方法5汇编语言的程序格式汇编语言程序的结构汇编语言语句类型及格式汇编语言的数据与表达式6源程序的一般格式STACK SEGMENT┇STACK ENDSDATA SEGMENT┇DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:…┇CODE ENDSEND START7例题一个两字相加的程序。
DATA SEGMENT ;定义数据段DATA1 DW 1234H ;定义被加数DATA2 DW 5678H ;定义加数DATA ENDS ;数据段结束ESEG SEGMENT ;定义附加段SUM DW 2 DUP(?);定义存放结果区ESEG ENDS ;附加段结束CODE SEGMENT ;定义代码段;下面的语句说明程序中定义的各段分别用哪个段寄存器寻址ASSUME CS:CODE, DS:DATA,ES:ESEGSTART:MOV AX,DSEG ;START为程序开始执行的启动标号MOV DS,AX ;初始化DSMOV AX,ESEGMOV ES,AX ;初始化ESLEA SI,SUM ;存放结果的偏移地址送SIMOV AX,DATA1 ;取被加数ADD AX,DATA2 ;两数相加MOV ES:[SI],AX ;和送附加段的SUM单元中HLTCODE ENDS ;代码段结束END START ;源程序结束8源程序的结构特点汇编语言程序通常由若干段组成,段由伪指令SEGMENT与ENDS定义,各段顺序任意,段的数目按需要确定,原则上不受限制。
实验一查看CPU和内存,用机器指令和汇编指令编程
实验⼀查看CPU和内存,⽤机器指令和汇编指令编程⼀.实验准备前⾔:由于⼤家的电脑⼤多使⽤的是64位的操作系统,不能在系统⾃带的MS-DOS环境下编写汇编源程序,所以我们需要DOSBox这个软件,以便在64位环境下编写汇编源程序。
下载完成后进⾏挂载,进⼊挂载虚拟盘进⼊debug环境即可⼆.使⽤debug将书中事例程序段写⼊内存,逐条执⾏,观察每条指令执⾏后CPU相关寄存器中内容的变化(可⽤E命令和A命令以两种⽅式将指令写⼊内存)1.使⽤e命令将指令机器码写⼊指定1000:0地址的内存2.使⽤u命令进⾏反汇编查看是否与对应的汇编指令相符合经过核对与相应的汇编指令符合3.使⽤t命令单步执⾏由于指令⾏数过多,这⾥只列出了部分代码截图。
经核对,其符合汇编指令的执⾏第⼀步,将寄存器ax的值设为4e20h第⼆步,将寄存器ax的值加上1416h变为6236h第三步,将寄存器bx的值设为2000h第四步,将寄存器ax的值与bx的值想加并赋给ax......步骤过多就不在此⼀⼀列举了,总之可以发现⽤e指令通过机器码修改内存的内容可以达到汇编指令的作⽤4.使⽤a命令以汇编指令的形式在内存中写⼊机器指令5.使⽤u反汇编指令检查汇编指令与机器码是否对应可以发现将汇编指令反汇编后的机器码与之前所列机器码⼀致6.使⽤t命令进⾏单步执⾏通过汇编指令与单步执⾏的结果与机器码单步执⾏的结果⼀致三.将下⾯三条指令写⼊从2000:0开始的内存单元中,使⽤下⾯三条指令计算2的8次⽅1.代码分析---恢复内容结束---实验结论⼀.实验准备前⾔:由于⼤家的电脑⼤多使⽤的是64位的操作系统,不能在系统⾃带的MS-DOS环境下编写汇编源程序,所以我们需要DOSBox这个软件,以便在64位环境下编写汇编源程序。
下载完成后进⾏挂载,进⼊挂载虚拟盘进⼊debug环境即可⼆.使⽤debug将书中事例程序段写⼊内存,逐条执⾏,观察每条指令执⾏后CPU相关寄存器中内容的变化(可⽤E命令和A命令以两种⽅式将指令写⼊内存)1.使⽤e命令将指令机器码写⼊指定1000:0地址的内存2.使⽤u命令进⾏反汇编查看是否与对应的汇编指令相符合经过核对与相应的汇编指令符合3.使⽤t命令单步执⾏由于指令⾏数过多,这⾥只列出了部分代码截图。
汇编指令对应的机器码
汇编指令对应的机器码一、引言汇编语言是一种低级语言,它是机器语言的助手。
在计算机科学中,汇编语言是用于编写程序的一种基于文本的语言,它使用助记符来表示每个指令操作码。
每个汇编指令都对应着一段机器码。
本文将从不同的角度详细介绍汇编指令对应的机器码。
二、汇编指令和机器码1. 汇编指令汇编指令是一种基于文本的符号表示法,用来代替二进制代码。
它通过使用助记符来表示操作码和操作数,使得程序员更容易地理解和修改代码。
例如,在x86架构中,mov指令可以用来将一个值从一个寄存器移动到另一个寄存器。
2. 机器码机器码是计算机可以直接执行的二进制代码。
它由0和1组成,并且具有特定的格式和结构。
每个CPU都有自己独特的指令集架构,因此不同CPU上相同的汇编代码可能会产生不同的机器码。
三、x86架构下常见汇编指令对应的机器码1. movmov指令用于将数据从一个位置复制到另一个位置。
在x86架构中,它的机器码通常是8位或16位。
例如,将寄存器AX中的值移动到寄存器BX中,其机器码为:89 C3。
2. addadd指令用于将两个数相加,并将结果存储在一个寄存器或内存位置中。
在x86架构中,它的机器码通常是8位或16位。
例如,将寄存器AX和BX中的值相加,并将结果存储在CX寄存器中,其机器码为:01 C8。
3. subsub指令用于从第一个数中减去第二个数,并将结果存储在一个寄存器或内存位置中。
在x86架构中,它的机器码通常是8位或16位。
例如,从寄存器AX中减去BX的值,并将结果存储在CX寄存器中,其机器码为:29 CB。
4. jmpjmp指令用于无条件跳转到程序的另一部分。
在x86架构中,它的机器码通常是2字节或4字节。
例如,在代码段偏移地址为0x1234处设置一个标签mylabel,并跳转到该标签所代表的地址处,其机器码为:EB 10(其中10表示偏移量)。
5. cmpcmp指令用于比较两个数的大小关系,并根据比较结果设置标志位。
汇编和机器码的对应表
单片机指令功能一览表助记符代码说明MOV A,Rn E8~EF寄存器AMOV A,direct E5 dircet直接字节送AMOV A,@Ri ER~E7间接RAM送AMOV A,#data74 data立即数送AMOV Rn,A F8~FF A送寄存器MOV Rn,dircet A8~AF dircet直接字节送寄存器MOV Rn,#data78~7F data立即数送寄存器MOV dircet,A F5 dircet A送直接字节MOV dircet,Rn88~8F dircet寄存器送直接字节MOV dircet1,dircet285 dircet1 dircet2直接字节送直接字节MOV dircet,@Ro86~87间接RAM送直接字节MOV dircet,#data75 dircet data立即数送直接字节MOV@Ri,A F6~F7A送间接RAMMOV@Ri,#data76~77 data直接字节送间接RAM MOV@Ri,#data76~77 data立即数送间接RAM MOV DPTR,#data1690 data 15~816位常数送数据指针data7~0MOVC A,@A+DPTR93由((A)+(DPTR))寻址的程序存贮器字节选AMOVC A,@A+PC83由((A)+(PC));寻址的程序存贮器字节送AMOVX A,@Ri E2~E3送外部数据(8位地址)送AMOVX A,@DPTR E0送外部数据(16位地址)送AMOVX@Ri,A F2~F3A送外部数据(8位地址)MOVX@DPTR,A F0A送外部数据(16位地址)PUSH dircet C0 dircet直接字节进栈,SP加1POP dircet D0 dircet直接字节退栈,SP减1XCH A,Rn C8~CF交换A和寄存器XCH A,dircet C5 dircet交换A和直接字节XCH A,@Ri C6~C7交换A和间接RAMXCH A,@Ri D6~D7交换A和间接RAM的低位SWAP A C4算术操作(A的二个半字节交换)ADD A,Rn28~2F寄存器加到AADD A,dircet25 dircet直接字节加到AADD A,@Ri26~27间接RAM加到AADD A,#data24data立即数加到AADD A,Rn38~3F寄存器和进位位加到A ADD A,dircet35dircet直接字节和进位位加到A ADD A,@Ri36~37间接字节和进位位加到A ADD A,data34 data立即数和进位位加到A ADD A,Rn98~9F A减去寄存器和进位位ADD A,dircet95 dircet A减去直接字节和进位位ADD A,@Ri36~37间接RAM和进位位加到A ADD A,data34 data立即数和进位位加到A SUBB A,Rn98~9F A减去寄存器和进位位SUBB A,dircet95 dircet A减去直接字节和进位位SUBB A,@Ri96~97A减去间接RAM和进位位SUBB A,#data94 data A减去立即数和进位位INC A04A加1INC Rn08~0F寄存器加1INC dircet05 dircet直接字节加1INC@Ri06~07间接RAM加1DEC A14A减1DEC Rn18~1F寄存器减1DEC dircet15 dircet直接字节减1DEC@Ri16~17间接RAM减1INC DPTR A3数据指针加1MUL AB A4A乘以BDIV AB84A除以BDA A D4A的十进制加法调整逻辑操作ANL A,Rn58~5F寄存器“与”到AANL A,dircet55 dircet直接字节“与”到AANL A,@Ri56~57间接RAm“与”到AANL A,#data54 data立即数“与”到AANL dircet A52 dircet A“与”到直接字节ANL dircet,#data53 dircet data立即数“与”到直接字节ORL A,Rn48~4F寄存器“或”到AORL A,dircet45 dircet直接字节“或”到AORL A,@Ri46~47间接RAM“或”到AORL A,#data44 data立即数“或”到AORL dircet,A42 dircet A“或”到直接字节ORL dircet,#data43 dircet data立即数“或”到直接字节XRL A,Rn68~6F寄存器“异或”到AXRL A,dircet65 dircet直接字节“异或”到AXRL A,@Ri66~67间接RAM“异或”到AXRL A,#data64 data立即数“异或”到AXRL dircet A62 dircet A“异或”到直接字节XRL dircet,#data63 dircet data立即数“异或”到直接字节CLR A E4清零CPL A F4A取反RL A23A左环移RLC A33A通过进位左环移RR A03A右环移RRC A13A通过进位右环移控制程序转移ACALL addr 11*1 addr(a7~a0)绝对子程序调用LCALL addr 1612 addr(15~8)长子程序调用addr(7~0)RET22子程序调用返回RETI addr 1132中断调用返回AJMP addr 11△1 addr(a7~a6)绝对转移LJMP addr 1602addr(15~8)长转移addr(7~0)SJMP rel80 rel短转移,相对转移JMP@A+DPTR73相对于DPTR间接转移JZ rel60 rel A为零转移JNZ rel70 rel A为零转移CJNE A,dircet,rel B5 dircet rel直接字节与A比较,不等则转移CJNE A,#data,rel B4 data rel立即数与A比较,不等则转移CJNE A,Rn,#data,rel B8~BF data rel立即数与寄存器比较,不等则转移CJNE@Ri,#data,rel B6~B7 data rel立即数与间接RAM 比较,不等则转移DJNZ Rn,rel D8~DF rel寄存器减1,不为零则转移DJNZ dircet,rel B5 dircet rel直接字节减1,不为零则转移NOP00空操作*=a10a9a8l△=a10a9a80布尔变量操作CLR C C3清零进位CLR bit C2清零直接位SETB C D3置位进位SETB bit D2置位直接位CPL C B3进位取反CPL bit B2直接位取反ANL C,bit82 dit直接数“与”到进位ANL C,/bit B0直接位的反“与”到进位ORL C,bit72 bit直接位“或”到进位ORL C,/bit A0 bit直接位的反“或”到进位MOV C,bit A2 bit直接位送进位MOV bit,C92 bit进位送直接位JC rel40 rel进位位为1转移JNC rel50 rel进位位为0转移JB bit,rel20 bit rel直接位为1相对转移JNB bit,rel30 bit rel直接位为0相对转移JBC bit,rel10 bit rel直接位为1相对转移,然后清零该位0人|分享到:阅读(213)| 评论(0)| 引用(0) |举报。
arm汇编语言格式
arm汇编语言格式
ARM汇编语言是一种底层的程序设计语言,用于编写针对ARM
架构的机器码指令。
ARM汇编语言的格式包括以下几个方面:
1. 注释,注释用于解释代码的作用和功能,以分号(;)开头。
注释对于代码的可读性和理解很重要。
2. 指令,指令是汇编语言的核心部分,用于执行特定的操作。
指令可以包含操作码(opcode)和操作数(operand)。
操作码指定
要执行的操作,操作数提供操作所需的数据。
3. 标号,标号用于标识代码的位置或跳转目标。
标号以英文字母、数字和下划线组成,以冒号(:)结尾。
4. 寄存器,ARM架构有一组通用寄存器,用于存储和处理数据。
寄存器以英文字母r开头,后跟一个数字,表示寄存器的编号。
例如,r0表示第一个通用寄存器,r1表示第二个通用寄存器,依此类推。
5. 操作数,操作数可以是立即数(immediate)、寄存器、内
存地址等。
立即数是直接出现在指令中的数值,寄存器是存储数据的容器,内存地址是存储器中数据的位置。
6. 伪指令,伪指令是用于辅助程序开发的指令,不会被转化为机器码。
伪指令以句点(.)开头,常用的伪指令有定义数据段、定义代码段、定义常量等。
7. 指令格式,ARM汇编语言的指令格式通常包括操作码、目的寄存器、源操作数和条件码。
具体的指令格式会根据不同的指令而有所不同。
总结起来,ARM汇编语言的格式包括注释、指令、标号、寄存器、操作数、伪指令和指令格式。
这些元素共同构成了ARM汇编语言的语法规则,通过合理的组合和使用,可以编写出有效的ARM汇编代码。
深入理解计算机系统(3.1)------汇编语言和机器语言
深⼊理解计算机系统(3.1)------汇编语⾔和机器语⾔ 《深⼊理解计算机系统》第三章——程序的机器级表⽰。
作者⾸先讲解了汇编代码和机器代码的关系,阐述了汇编承上启下的作⽤;接着从机器语⾔IA32着⼿,分别讲述了如何存储数据、如何访问数据、如何完成运算以及如何进⾏跳转。
通过这些步骤,⼜告诉了我们分⽀语句、循环语句是怎么完成的,函数调⽤、栈帧结构以及递归过程。
最后能通过编译器产⽣的汇编代码表⽰,我们要了解编译器和它的优化能⼒,知道编译器能为我们完成哪些⼯作。
⽽这篇博客我们将讲解汇编和机器代码的关系。
⾸先下⾯⼀张图是C语⾔、汇编语⾔以及翻译过的机器语⾔,⼤家可以先有个⼤概的眼熟。
上图引⽤⾄:1、机器语⾔ 这系列博客第⼀篇我们就详细讲解了程序的编译,⼀个C语⾔程序是经过编译器变成汇编程序,然后通过汇编器变成机器代码,最后被计算机执⾏。
计算机是不能直接识别我们所编写的C程序或者Java程序的。
它只能识别机器语⾔,⽽机器语⾔是⽤⼆进制代码表⽰的计算机能直接识别和执⾏的⼀种机器指指令系统令的集合。
早期计算机就是指可以执⾏机器指令,进⾏运算的机器。
在我们常⽤的PC机中,有⼀个芯⽚,就是我们常说的CPU(Central Processing Unit,中央处理单元)可以完成前⾯所说的计算机的功能,但是每⼀种这样的微处理器(CPU)由于硬件设计和内部结构的不同,就需要⽤不同的电平脉冲来控制,使它⼯作。
所以每⼀种微处理器都有⾃⼰的机器指令集,也就是机器语⾔。
早期的程序设计均使⽤机器语⾔。
程序员们将⽤0, 1数字编成的程序代码打在纸带或卡⽚上,1打孔,0不打孔,再将程序通过纸带机或卡⽚机输⼊计算机,进⾏运算。
⽤机器语⾔编写程序,编程⼈员要⾸先熟记所⽤计算机的全部指令代码和代码的涵义。
⼿编程序时,程序员得⾃⼰处理每条指令和每⼀数据的存储分配和输⼊输出,还得记住编程过程中每步所使⽤的⼯作单元处在何种状态。
这是⼀件⼗分繁琐的⼯作。
汇编语言指令大全X86和X87汇编指令大全(带注释)
汇编语⾔指令⼤全X86和X87汇编指令⼤全(带注释)⽬录⼀、数据传输指令1. 通⽤数据传送指令.2. 输⼊输出端⼝传送指令.3. ⽬的地址传送指令.4. 标志传送指令.⼆、算术运算指令三、逻辑运算指令四、串指令五、程序转移指令六、伪指令七、处理机控制指令:标志处理指令浮点运算指令集1、控制指令2、数据传送指令3、⽐较指令4、运算指令其它1.机械码,⼜称机器码.2.需要熟练掌握的全部汇编知识(只有这么多)3.常见修改(机器码)4.两种不同情况的不同修改⽅法⼀、数据传输指令它们在存贮器和寄存器、寄存器和输⼊输出端⼝之间传送数据.1. 通⽤数据传送指令.MOV 传送字或字节.MOVSX 先符号扩展,再传送.MOVZX 先零扩展,再传送.PUSH 把字压⼊堆栈.POP 把字弹出堆栈.PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压⼊堆栈.POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压⼊堆栈.POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.BSWAP 交换32位寄存器⾥字节的顺序XCHG 交换字或字节.(⾄少有⼀个操作数为寄存器,段寄存器不可作为操作数)CMPXCHG ⽐较并交换操作数.(第⼆个操作数必须为累加器AL/AX/EAX)XADD 先交换再累加.(结果在第⼀个操作数⾥)XLAT 字节查表转换.----BX指向⼀张256字节的表的起点,AL为表的索引值(0-255,即0-FFH);返回AL为查表结果.([BX+AL]->AL)2. 输⼊输出端⼝传送指令.IN I/O端⼝输⼊. ( 语法: IN 累加器, {端⼝号│DX} )OUT I/O端⼝输出. ( 语法: OUT {端⼝号│DX},累加器 )输⼊输出端⼝由⽴即⽅式指定时, 其范围是 0-255; 由寄存器 DX 指定时,其范围是 0-65535.3. ⽬的地址传送指令.LEA 装⼊有效地址.例: LEA DX,string ;把偏移地址存到DX.LDS 传送⽬标指针,把指针内容装⼊DS.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES 传送⽬标指针,把指针内容装⼊ES.例: LES DI,string ;把段地址:偏移地址存到ES:DI.LFS 传送⽬标指针,把指针内容装⼊FS.例: LFS DI,string ;把段地址:偏移地址存到FS:DI.LGS 传送⽬标指针,把指针内容装⼊GS.例: LGS DI,string ;把段地址:偏移地址存到GS:DI.LSS 传送⽬标指针,把指针内容装⼊SS.例: LSS DI,string ;把段地址:偏移地址存到SS:DI.4. 标志传送指令.LAHF 标志寄存器传送,把标志装⼊AH.SAHF 标志寄存器传送,把AH内容装⼊标志寄存器.PUSHF 标志⼊栈.POPF 标志出栈.PUSHD 32位标志⼊栈.POPD 32位标志出栈.⼆、算术运算指令ADD 加法.ADC 带进位加法.INC 加 1.AAA 加法的ASCII码调整.DAA 加法的⼗进制调整.SUB 减法.SBB 带借位减法.DEC 减 1.NEG 求反(以 0 减之).CMP ⽐较.(两操作数作减法,仅修改标志位,不回送结果).AAS 减法的ASCII码调整.DAS 减法的⼗进制调整.MUL ⽆符号乘法.结果回送AH和AL(字节运算),或DX和AX(字运算),IMUL 整数乘法.结果回送AH和AL(字节运算),或DX和AX(字运算),AAM 乘法的ASCII码调整.DIV ⽆符号除法.结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).IDIV 整数除法.结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).AAD 除法的ASCII码调整.CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)三、逻辑运算指令AND 与运算.XOR 异或运算.NOT 取反.TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).SHL 逻辑左移.SAL 算术左移.(=SHL)SHR 逻辑右移.SAR 算术右移.(=SHR)ROL 循环左移.ROR 循环右移.RCL 通过进位的循环左移.RCR 通过进位的循环右移.以上⼋种移位指令,其移位次数可达255次.移位⼀次时, 可直接⽤操作码. 如 SHL AX,1.移位>1次时, 则由寄存器CL给出移位次数.如 MOV CL,04 SHL AX,CL四、串指令DS:SI 源串段寄存器 :源串变址.ES:DI ⽬标串段寄存器:⽬标串变址.CX 重复次数计数器.AL/AX 扫描值.D标志 0表⽰重复操作中SI和DI应⾃动增量; 1表⽰应⾃动减量.Z标志⽤来控制扫描或⽐较操作的结束.MOVS 串传送.( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )CMPS 串⽐较.( CMPSB ⽐较字符. CMPSW ⽐较字. )SCAS 串扫描.把AL或AX的内容与⽬标串作⽐较,⽐较结果反映在标志位.LODS 装⼊串.把源串中的元素(字或字节)逐⼀装⼊AL或AX中.( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. ) STOS 保存串.是LODS的逆过程.REP 当CX/ECX<>0时重复.REPE/REPZ 当ZF=1或⽐较结果相等,且CX/ECX<>0时重复.REPNE/REPNZ 当ZF=0或⽐较结果不相等,且CX/ECX<>0时重复.REPC 当CF=1且CX/ECX<>0时重复.REPNC 当CF=0且CX/ECX<>0时重复.五、程序转移指令1. ⽆条件转移指令 (长转移)JMP ⽆条件转移指令CALL 过程调⽤RET/RETF 过程返回.2. 条件转移指令 (短转移,-128到+127的距离内)( 当且仅当(SF XOR OF)=1时,OP1<OP2 )JA/JNBE 不⼩于或不等于时转移.JAE/JNB ⼤于或等于转移.JB/JNAE ⼩于转移.JBE/JNA ⼩于或等于转移.以上四条,测试⽆符号整数运算的结果(标志C和Z).JG/JNLE ⼤于转移.JGE/JNL ⼤于或等于转移.JL/JNGE ⼩于转移.JLE/JNG ⼩于或等于转移.以上四条,测试带符号整数运算的结果(标志S,O和Z).JE/JZ 等于转移.JNE/JNZ 不等于时转移.JC 有进位时转移.JNC ⽆进位时转移.JNO 不溢出时转移.JNP/JPO 奇偶性为奇数时转移.JNS 符号位为 "0" 时转移.JO 溢出转移.JP/JPE 奇偶性为偶数时转移.JS 符号位为 "1" 时转移.3. 循环控制指令(短转移)LOOP CX不为零时循环.LOOPE/LOOPZ CX不为零且标志Z=1时循环.LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.JCXZ CX为零时转移.JECXZ ECX为零时转移.4. 中断指令INT 中断指令INTO 溢出中断IRET 中断返回5. 处理器控制指令HLT 处理器暂停, 直到出现中断或复位信号才继续.WAIT 当芯⽚引线TEST为⾼电平时使CPU进⼊等待状态.ESC 转换到外处理器.LOCK 封锁总线.NOP 空操作.STC 置进位标志位.CLC 清进位标志位.CMC 进位标志取反.STD 置⽅向标志位.CLD 清⽅向标志位.STI 置中断允许位.CLI 清中断允许位.六、伪指令DW 定义字(2字节).PROC 定义过程.ENDP 过程结束.SEGMENT 定义段.ASSUME 建⽴段寄存器寻址.ENDS 段结束.END 程序结束.七、处理机控制指令:标志处理指令CMC 进位位求反指令STC 进位位置为1指令CLD ⽅向标志置1指令STD ⽅向标志位置1指令CLI 中断标志置0指令STI 中断标志置1指令NOP ⽆操作HLT 停机WAIT 等待ESC 换码LOCK 封锁浮点运算指令集1、控制指令(带9B的控制指令前缀F变为FN时浮点不检查,机器码去掉9B)FINIT 初始化浮点部件机器码 9B DB E3FCLEX 清除异常机器码 9B DB E2FDISI 浮点检查禁⽌中断机器码 9B DB E1FENI 浮点检查禁⽌中断⼆机器码 9B DB E0WAIT 同步CPU和FPU 机器码 9BFWAIT 同步CPU和FPU 机器码 D9 D0FNOP ⽆操作机器码 DA E9FXCH 交换ST(0)和ST(1) 机器码 D9 C9FXCH ST(i) 交换ST(0)和ST(i) 机器码 D9 C1iiiFSTSW ax 状态字到ax 机器码 9B DF E0FSTSW word ptr mem 状态字到mem 机器码 9B DD mm111mmmFLDCW word ptr mem mem到状态字机器码 D9 mm101mmmFSTCW word ptr mem 控制字到mem 机器码 9B D9 mm111mmmFLDENV word ptr mem mem到全环境机器码 D9 mm100mmmFSTENV word ptr mem 全环境到mem 机器码 9B D9 mm110mmmFRSTOR word ptr mem mem到FPU状态机器码 DD mm100mmmFSAVE word ptr mem FPU状态到mem 机器码 9B DD mm110mmmFFREE ST(i) 标志ST(i)未使⽤机器码 DD C0iiiFDECSTP 减少栈指针1->0 2->1 机器码 D9 F6FINCSTP 增加栈指针0->1 1->2 机器码 D9 F7FSETPM 浮点设置保护机器码 DB E42、数据传送指令FLDZ 将0.0装⼊ST(0) 机器码 D9 EEFLD1 将1.0装⼊ST(0) 机器码 D9 E8FLDPI 将π装⼊ST(0) 机器码 D9 EBFLDL2T 将ln10/ln2装⼊ST(0) 机器码 D9 E9FLDL2E 将1/ln2装⼊ST(0) 机器码 D9 EAFLDLG2 将ln2/ln10装⼊ST(0) 机器码 D9 ECFLDLN2 将ln2装⼊ST(0) 机器码 D9 EDFLD real4 ptr mem 装⼊mem的单精度浮点数机器码 D9 mm000mmmFLD real8 ptr mem 装⼊mem的双精度浮点数机器码 DD mm000mmmFLD real10 ptr mem 装⼊mem的⼗字节浮点数机器码 DB mm101mmmFILD word ptr mem 装⼊mem的⼆字节整数机器码 DF mm000mmmFILD dword ptr mem 装⼊mem的四字节整数机器码 DB mm000mmmFILD qword ptr mem 装⼊mem的⼋字节整数机器码 DF mm101mmmFBLD tbyte ptr mem 装⼊mem的⼗字节BCD数机器码 DF mm100mmmFST real4 ptr mem 保存单精度浮点数到mem 机器码 D9 mm010mmmFST real8 ptr mem 保存双精度浮点数到mem 机器码 DD mm010mmmFIST word ptr mem 保存⼆字节整数到mem 机器码 DF mm010mmmFIST dword ptr mem 保存四字节整数到mem 机器码 DB mm010mmmFSTP real4 ptr mem 保存单精度浮点数到mem并出栈机器码 D9 mm011mmmFSTP real8 ptr mem 保存双精度浮点数到mem并出栈机器码 DD mm011mmmFSTP real10 ptr mem 保存⼗字节浮点数到mem并出栈机器码 DB mm111mmmFISTP word ptr mem 保存⼆字节整数到mem并出栈机器码 DF mm011mmmFISTP dword ptr mem 保存四字节整数到mem并出栈机器码 DB mm011mmmFISTP qword ptr mem 保存⼋字节整数到mem并出栈机器码 DF mm111mmmFBSTP tbyte ptr mem 保存⼗字节BCD数到mem并出栈机器码 DF mm110mmmFCMOVB ST(0),ST(i) <时传送机器码 DA C0iiiFCMOVBE ST(0),ST(i) <=时传送机器码 DA D0iiiFCMOVE ST(0),ST(i) =时传送机器码 DA C1iiiFCMOVNB ST(0),ST(i) >=时传送机器码 DB C0iiiFCMOVNBE ST(0),ST(i) >时传送机器码 DB D0iiiFCMOVNE ST(0),ST(i) !=时传送机器码 DB C1iiiFCMOVNU ST(0),ST(i) 有序时传送机器码 DB D1iiiFCMOVU ST(0),ST(i) ⽆序时传送机器码 DA D1iii3、⽐较指令FCOM ST(0)-ST(1) 机器码 D8 D1FCOMI ST(0),ST(i) ST(0)-ST(1) 机器码 DB F0iiiFCOMIP ST(0),ST(i) ST(0)-ST(1)并出栈机器码 DF F0iiiFCOM real4 ptr mem ST(0)-实数mem 机器码 D8 mm010mmmFCOM real8 ptr mem ST(0)-实数mem 机器码 DC mm010mmmFICOM word ptr mem ST(0)-整数mem 机器码 DE mm010mmmFICOM dword ptr mem ST(0)-整数mem 机器码 DA mm010mmmFICOMP word ptr mem ST(0)-整数mem并出栈机器码 DE mm011mmmFICOMP dword ptr mem ST(0)-整数mem并出栈机器码 DA mm011mmmFTST ST(0)-0 机器码 D9 E4FUCOM ST(i) ST(0)-ST(i) 机器码 DD E0iiiFUCOMP ST(i) ST(0)-ST(i)并出栈机器码 DD E1iiiFUCOMPP ST(0)-ST(1)并⼆次出栈机器码 DA E9FXAM ST(0)规格类型机器码 D9 E54、运算指令FADD 把⽬的操作数 (直接接在指令后的变量或堆栈缓存器) 与来源操作数 (接在⽬的操作数后的变量或堆栈缓存器) 相加,并将结果存⼊⽬的操作数FADDP ST(i),ST 这个指令是使⽬的操作数加上 ST 缓存器,并弹出 ST 缓存器,⽽⽬的操作数必须是堆栈缓存器的其中之⼀,最后不管⽬的操作数为何,经弹出⼀次后,⽬的操作数会变成上⼀个堆栈缓存器了FIADD FIADD 是把 ST 加上来源操作数,然后再存⼊ ST 缓存器,来源操作数必须是字组整数或短整数形态的变数FSUB 减FSUBPFSUBR 减数与被减数互换FSUBRPFISUBFISUBRFMUL 乘FMULPFIMULFDIV 除FDIVPFDIVRFDIVRPFIDIVFIDIVRFCHS 改变 ST 的正负值FABS 把 ST 之值取出,取其绝对值后再存回去。
mips机器码汇编对照表
mips机器码汇编对照表助记符说明字节周期代码MOV A,Rn 寄存器送A 1 1 E8--EFMOV A,data 直接字节送A 2 1 E5MOV A,@Ri 间接RAM 送A 1 1 E6--E7MOV A,#data 立接数送A 2 1 74MOV Rn,A A 送寄存器 1 1 F8--FFMOV Rn,data 直接数送寄存器 2 2 A8--AFMOV Rn,#data 立即数送寄存器 2 1 78--7FMOV data,A A 送直接字节 2 1 F5MOV data,Rn 寄存器送直接字节 2 1 88—8FMOV data,data 直接字节送直接字节 3 2 85MOV data,@Ri 间接Rn 送直接字节 2 2 86;87MOV data,#data 立即数送直接字节 3 2 75MOV @Ri,A A 送间接Rn 1 2 F6;F7MOV @Ri,data 直接字节送间接Rn 1 1 A6;A7MOV @Ri,#data 立即数送间接Rn 2 2 76;77MOV DPTR,#data16 16 位常数送数据指针 3 1 90 MOV C,bit 直接位送进位位 2 1 A2MOV bit,C 进位位送直接位 2 2 92MOVC A,@A+DPTR A+DPTR 寻址程序存贮字节送A 3 2 93 MOVC A,@A+PC A+PC 寻址程序存贮字节送A 1 2 83 MOVX A,@Ri 外部数据送A(8 位地址) 1 2 E2;E3 MOVX A,@DPTR 外部数据送A(16 位地址) 1 2 E0 MOVX @Ri,A A 送外部数据(8 位地址) 1 2 F2;F3 MOVX @DPTR,A A 送外部数据(16 位地址) 1 2 F0 PUSH data 直接字节进栈道,SP 加1 2 2 C0POP data 直接字节出栈,SP 减1 2 2 D0XCH A,Rn 寄存器与A 交换 1 1 C8—CFXCH A,data 直接字节与A 交换 2 1 C5XCH A,@Ri 间接Rn 与A 交换 1 1 C6;C7XCHD A,@Ri 间接Rn 与A 低半字节交换 1 1 D6;D72.逻辑运算指令(35条)助记符说明字节周期代码ANL A,Rn 寄存器与到A 1 1 58—5FANL A,data 直接字节与到A 2 1 55ANL A,@Ri 间接RAM与到A 1 1 56;57ANL A,#data 立即数与到A 2 1 54ANL data,A A与到直接字节 2 1 52ANL data,#data 立即数与到直接字节 3 2 53 ANL C,bit 直接位与到进位位 2 2 82ANL C,/bit 直接位的反码与到进位位 2 2 B0 ORL A,Rn 寄存器或到A 1 1 48—4FORL A,data 直接字节或到A 2 1 45ORL A,@Ri 间接RAM或到A 1 1 46;47ORL A,#data 立即数或到A 2 1 44ORL data,A A或到直接字节 2 1 42ORL data,#data 立即数或到直接字节 3 2 43 ORL C,bit 直接位或到进位位 2 2 72ORL C,/bit 直接位的反码或到进位位 2 2 A0 XRL A,Rn 寄存器异或到A 1 1 68—6FXRL A,data 直接字节异或到A 2 1 65XRL A,@Ri 间接RAM异或到A 1 1 66;67XRL A,#data 立即数异或到A 2 1 64XRL data,A A异或到直接字节 2 1 62XRL data,#data 立即数异或到直接字节 3 2 63 SETB C 进位位置1 1 1 D3SETB bit 直接位置1 2 1 D2CLR A A清0 1 1 E4CLR C 进位位清0 1 1 C3CLR bit 直接位清0 2 1 C2CPL A A求反码 1 1 F4CPL C 进位位取反 1 1 B3CPL bit 直接位取反 2 1 B2RL A A循环左移一位 1 1 23RLC A A 带进位左移一位 1 1 33RR A A右移一位 1 1 03RRC A A 带进位右移一位 1 1 13SWAP A A 半字节交换 1 1 C43.算术运算指令(24条)助记符说明字节周期代码ADD A,Rn 寄存器加到A 1 1 28—2FADD A,data 直接字节加到A 2 1 25ADD A,@Ri 间接RAM 加到A 1 1 26;27 ADD A,#data 立即数加到A 2 1 24ADDC A,Rn 寄存器带进位加到A 1 1 38—3F ADDC A,data 直接字节带进位加到A 2 1 35ADDC A,@Ri 间接RAM 带进位加到A 1 1 36;37 ADDC A,#data 立即数带进位加到A 2 1 34SUBB A,Rn 从A 中减去寄存器和进位 1 1 98—9F SUBB A,data 从A 中减去直接字节和进位 2 1 95 SUBB A,@Ri 从A 中减去间接RAM 和进位 1 1 96;97 SUBB A,#data 从A 中减去立即数和进位 2 1 94 INC A A加1 1 1 04INC Rn 寄存器加1 1 1 08—0FINC data 直接字节加1 2 1 05INC @Ri 间接RAM 加1 1 1 06;07INC DPTR 数据指针加1 1 2 A3DEC A A减1 1 1 14DEC Rn 寄存器减1 1 1 18—1FDEC data 直接字节减1 2 1 15DEC @Ri 间接RAM 减1 1 1 16;17MUL AB A乘B 1 4 A4DIV AB A被B除 1 4 84DA A A十进制调整 1 1 D44.转移指令(22条)助记符说明字节周期代码AJMP addr 11 绝对转移 2 2 *1LJMP addr 16 长转移 3 2 02SJMP rel 短转移 2 2 80JMP @A+DPTR 相对于DPTR 间接转移 1 2 73JZ rel 若A=0 则转移 2 2 60JNZ rel 若A≠0 则转移 2 2 70JC rel 若C=1 则转移 2 2 40JNC rel 若C≠1 则转移 2 2 50JB bit,rel 若直接位=1 则转移 3 2 20JNB bit,rel 若直接位=0 则转移 3 2 30JBC bit,rel 若直接位=1 则转移且清除 3 2 10CJNE A,data,rel 直接数与A 比较,不等转移 3 2 B5CJNE A,#data,rel 立即数与A 比较,不等转移 3 2 B4CJNE @Ri,#data,rel 立即数与间接RAM比较,不等转移 3 2 B6;B7CJNE Rn,#data,rel 立即数与寄存器比较不等转移 3 2 B8—BFDJNZ Rn,rel 寄存器减1 不为0 转移 2 2 D8—DFDJNZ data,rel 直接字节减1 不为0 转移 3 2 D5ACALL addr 11 绝对子程序调用 2 2 *1 LCALL addr 16 子程序调用 3 2 12 RET 子程序调用返回 1 2 22RETI 中断程序调用返回 1 2 32NOP 空操作 1 1 00。
计算机机器码转换方法
计算机机器码转换方法
计算机机器码是一种二进制代码,通常用于指令执行和数据处理。
但是,对于人类来说,机器码并不直观和易于理解。
因此,需要将机器码转换成更易于阅读和理解的形式。
下面是一些常见的机器码转换方法:
1. 十六进制表示法:将每个二进制数位组成四位二进制数,然
后将这些四位二进制数转换成对应的十六进制数。
例如,二进制数11011010可以表示为0xDA,其中D对应二进制数1101,A对应二进
制数1010。
2. 汇编指令:将机器码转换成对应的汇编指令。
汇编指令是一
种更易于理解的低级语言,可以直接在计算机上执行。
例如,机器码10110000可以转换成指令MOV AL, 0。
3. 反汇编:将机器码反编译成更易于阅读和理解的汇编指令。
反汇编是一种将机器码转换为汇编指令的过程,通常使用专门的反汇编工具。
4. 机器码分析:通过分析机器码的结构和功能,理解其作用和
含义。
这种方法需要深入了解计算机体系结构和指令集。
总之,机器码转换方法可以帮助我们更好地理解和分析计算机程序的执行过程,对于计算机科学和工程领域的从业人员来说,是一种必要的技能。
- 1 -。
汇编指令机器码总结
汇编指令机器码总结与验证摘要:本文介绍了汇编指令机器码的含义与作用,并讨论了指令的组成结构即操作码与地址码。
然后全面总结了机器码中的单字节操作码,并利用Debug工具进行了详细的验证。
关键词:指令;机器码一、机器码概述[1]机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合。
这种指令集就称为机器码,它是电脑的CPU可直接解读的数据。
一条指令是机器语言的一个语句,是一组有意义的二进制代码。
计算机通过执行指令来处理各种数据。
为了指出数据的来源、操作结果的去向及所执行的操作,一条指令必须包含下列信息:a) 操作码b) 操作数的地址c) 操作结果的存储地址d) 下条指令的地址一条指令实际上包括两种信息即操作码和地址码。
操作码用来表示该指令所要完成的操作(如加、减、乘、除、数据传送等),其长度取决于指令系统中的指令条数。
地址码用来描述该指令的操作对象,它或者直接给出操作数,或者指出操作数的存储器地址或寄存器地址(即寄存器名)。
二、机器码详解[2]由上文已知,一条指令一般由操作码和地址码组成。
其中,操作码是指明CPU对内存或寄存器中的数据进行什么样的操作,地址码给出这些数据对象。
下面我们就将指令分为两部分进行研究。
1.操作码操作码一般占用1个字节(8位)或2个字节(16位)。
其中最低比特(记作W)在很多指令中表示目标操作数的位宽,W=0表示字节长(8位)操作数,W=1表示双字节长(16位)操作数。
例如,操作码00000000B(W=0)表示“ADD 8位寄存器,8位寄存器”,而00000001B(W=1)表示“ADD 16位寄存器,16位寄存器”。
2.地址码地址码一般占用1个字节,其中的8个比特位可分为三组,形式一般为“oommmrrr”。
这些分组大致可分为以下四个类型:1) “oo”——表示指令的地址偏移量类型a) 00:如果mmm=110,那么指令后紧跟一个地址偏移量;否则未使用地址偏移量b) 01:指令后紧跟一个8比特无符号地址偏移量c) 10:指令后紧跟一个16比特无符号地址偏移量d) 11:此时mmm表示一个寄存器而不是地址2) “mmm”——表示存储器操作数地址a) 000 : DS:[BX+SI]b) 001 : DS:[BX+DI]c) 010 : SS:[BP+SI]d) 011 : SS:[BP+DI]e) 100 : DS:[SI]f) 101 : DS:[DI]g) 110 : SS:[BP]h) 111 : DS:[BX]3) “rrr”——表示通用寄存器(下列分别表示当W=0;W=1;32位)a) 000:AL:AX:EAXb) 001:CL:CX:ECXc) 010:DL:DX:EDXd) 011:BL:BX:EBXe) 100:AH:SP:ESPf) 101:CH:BP:EBPg) 110:DH:SI:ESIh) 111:BH:DI:EDI4) “sss”——表示段寄存器a) 000 : ESb) 001 : CSc) 010 : SSd) 011 : DSe) 100 : FS (386+)f) 101 : GS (386+)三、操作码总结与验证[3]从上一节可以看出,一条指令的操作码变化有限(8比特操作码只有不超过256个)而且相对地址码更为重要,因此这一节我们重点讨论单字节指令的操作码。
汇编指令与机器码的相互转换
汇编指令与机器码的相互转换机器语言我们只要重点理解一下几个概念:1. 机器语言指令有操作码(OP)和地址码两部分组成|_____________OP_______________|__d__|__w__||_____________OP_______________|__s__|__w__| <--此格式用于立即寻址方式在多数操作码中,常使用某些位来指示某些信息:如图上结构里的:w=1 时对字来操作w=0 时对字节来操作d值在双操作数指令中才有效当d=1 时有且只有一个寄存器用于目的操作数d=0 时有且只有一个寄存器用于源操作数s=1 时立即数为8位,但要求扩展成16位数s=0 时当指令作字节操作/有16位立即数由于汇编的指令格式很多,这里我只作一些基本情况介绍,必要时读者可以下载/查阅80x86汇编小站提供的OPCODES手册来查阅。
2. 寻址方式的机器语言表示:| mod | reg | r/m ||_____|_____|_____|_____|_____|_____|_____|reg 表示寄存器方式,在不包括立即数的双操作数指令的情况下,规定必须有一个操作数在寄存器中,该寄存器由reg字段指定,并与操作码字节中的w位相组合确定的寄存器mod字段与r/m(register/memory)字段结合在一起确定另一个操作数的寻址方式现在你们下载了80x86汇编小站()提供的OPCODES 手册了吗?下载好了,请解压后打开里面的:opcodes.html 文件,然后熟悉里面的表格:现在熟悉简单的:____________________________________________________________________________ __表1 <PS:部分资料> rrr : W=0 : W=1 : reg32000 : AL : AX : EAX001 : CL : CX : ECX010 : DL : DX : EDX011 : BL : BX : EBX100 : AH : SP : ESP101 : CH : BP : EBP110 : DH : SI : ESI111 : BH : DI : EDI____________________________________________________________________________ __表2 <PS:部分资料> rrr : Index Register000 : EAX001 : ECX010 : EDX011 : EBX100 : No Index101 : EBP110 : ES I111 : EDI____________________________________________________________________________ __表3 <PS:部分资料> mmm : Function 11w=1000 : DS:[BX+S I]001 : DS:[BX+DI]010 : SS:[BP+S I]011 : SS:[BP+DI] BX100 : DS:[SI]101 : DS:[DI]110 : SS:[BP]111 : DS:[BX]____________________________________________________________________________ __表4 <PS:部分资料>oo : Function00 : If mmm = 110, then a displacement follows the operation; otherwise, no displacement is used01 : An 8-bit signed displacement follows the opcode10 : A 16-bit signed displacement follows the opcode11 : mmm specifies a register, instead of an addressing mode____________________________________________________________________________ __上面的表,你都看明白了吗?现在我就教你们如何利用这样的表格来把汇编指令翻译机器码3.指令格式简介8086所用的16位指令格式:________ _____________ ________ ________|操作码| + |mod-reg-r/m| + |位移量| + |立即数|1~2字节0~1字节0~2字节0~2字节OK!以上就是基本知识,下面我们来实践吧:———————————————————————————————————————问题:MOV AX,1234H 对应的机器码为:B83412MOV EBX,0 对应的机器码为:66BB00000000MOV CL,55H 对应的机器码为: B155MOV AX,BX 对应的机器码为:8BC3我在问一下,机器码的数据格式是什么?好像是机器指令+操作数(高位存放在地址高位,低位存放在地址低位),但是前面MOV AX,怎么就变成了B8,弄不明白,请指教。
暴力破解中所用到的汇编指令机器码知识
关于暴力破解中所用到的汇编指令机器码知识
我们在暴力破解中修改的对象基本上都是条件跳转指令(如 JZ、JNZ、JG。
等等)和无条件跳转指令JMP,对于其它地方的修改多数都是改成NOP,所以这里主要讲一下跳转指令对应的机器码。
在80X86 体系的CPU中,成对条件跳转指令(指的是判断条件刚好相反)如下所示:
JZ<-->JNZ
JE<-->JNE
JB(JNAE)<-->JNB(JAE)
JC<-->JNC
JA(JNBE)<-->JNA(JBE)
JG(JNLE)<-->JNG(JLE)
JL(JNGE)<-->JNL(JGE)
JS<-->JNS
JP(JPE)<-->JNP(JPO)
JO<-->JNO
80X86体系CPU中的条件跳转指令分为单字节和双字节指令两种,分别对应8BIT和16BIT跳转;而与条件跳转指令相匹配的无条件跳转指令 JMP也有单字节和双字节指令两种,分别对应8BIT和16BIT跳转,当我们需要将条件跳转指令改成相应的无条件跳转指令时,因为要保持修改前后机器码长度的一致性,所以要注意被修改的条件跳转指令是单字节还是双字节指令,从而用相应字节的JMP机器码来代替,下表列出了暴力破解中条件跳转指令的修改方法:
关于跟踪程序时如何在Softice中动态改变条件跳转指令的执行方向:
还有一种方法是用鼠标点击寄存器窗口的EIP,然后直接输入目标代码的IP地址就可以了,不过使用这个方法时要小心,否则使程序跑飞就完蛋了!。
51汇编和机器码对照表
2
1
C2
CPL A
A求反码
1
1
F4
CPL C
进位位取反
1
1
B3
CPL bit
直接位取反
2
1
B2
RL A
A循环左移一位
1
1
23
RLC A
A 带进位左移一位
1
1
33
RR A
A右移一位
1
1
03
RRC A
A 带进位右移一位
1
1
13
SWAP A
A 半字节交换
1
1
C4
3.算术运算指令(24条)
ADD A,Rn
16;17
MUL AB
A乘B
1
4
A4
DIV AB
A被B除
1
4
84
DA A
A十进制调整
1
1
D4
4.转移指令(22条)
AJMP addr 11
绝对转移
2
2
*1
LJMP addr 16
长转移
3
2
02
SJMP rel
短转移
2
2
80
JMP @A+DPTR
相对于DPTR 间接转移
1
2
73
JZ rel
若A=0 则转移
2
2
D8—DF
DJNZ data,rel
直接字节减1 不为 0 转移
3
2
D5
ACALL addr 11
绝对子程序调用
2
2
*1
LCALL addr 16
子程序调用
CPU指令、机器码、程序和汇编语言
CPU指令、机器码、程序和汇编语⾔⼀、指令指令就是指挥机器⼯作的指⽰和命令。
控制器靠指令指挥机器⼯作,⼈们⽤指令表达⾃⼰的意图,并交给控制器执⾏。
⼀台计算机所能执⾏的各种不同指令的全体,叫做计算机的指令系统或指令集,每⼀台计算机均有⾃⼰的特定的指令系统,其指令内容和格式有所不同。
⼀条指令具有实际的意义,CPU会完成⼀次操作,达到⼀定⽬的。
⼈类能够理解其意义。
⼆、机器码机器码说⽩了,就是⽤⼀种机器也就是CPU认识和理解的有⼀定结构的语⾔来表达指令,某条指令⽤这种语⾔表达成⼀条语句,就是这条指令的机器码。
我们知道,现在的CPU他只能理解⼆进制,那么机器码就是某条指令在某个CPU上⼀组有意义的⼆进制代码。
为了指出数据来源、操作结果去向及所要执⾏的操作,指令必须包含下列信息:操作码⽤来表⽰该指令要完成的操作,如+-*/等操作数或操作数地址⽤来指出操作对象的地址(内存地址或寄存器)或直接给出操作数操作结果存储地址下条指令地址如何区分指令和数据:我们可以通过不同的时间段来区分指令和数据,即在取指令阶段(或取指微程序)取出的为指令,在执⾏指令阶段(或相应微程序)取出的即为数据。
如果通过地址来源区分,由PC提供存储单元地址的取出的是指令,由指令地址码部分提供存储单元地址的取出的是操作数。
三、程序计算机程序(英语:Computer program),也称为(英语:software),简称程序。
是指⼀组指⽰计算机或其他具有信息处理能⼒装置执⾏动作或做出判断的指令。
也就是说,程序是为了实现某个⽬的或功能,按照⼀定逻辑⼈为编写的在特定⽬标机上运⾏的指令和数据的集合。
四、汇编语⾔为了编写计算机能运⾏的程序,早期的程序设计均使⽤机器语⾔。
程序员们将⽤0, 1数字编成的程序代码打在纸带或卡⽚上,1打孔,0不打孔,再将程序通过纸带机或卡⽚机输⼊计算机,进⾏运算。
这样的机器语⾔由纯粹的0和1构成,⼗分复杂,不⽅便阅读和修改,也容易产⽣错误。
ARM架构的机器码和汇编指令互相转换
ARM架构的机器码和汇编指令互相转换因为项⽬的⼀些需求,需要查看⼀些汇编指令对应的机器码是什么,也需要查看⼀些机器码对应的汇编指令是啥,经过⽹上查找的⼀些资料,找到了⼀个⽐较轻量、⽅便、快捷的⽅法。
⾸先第⼀步需要配置arm-linux-gcc交叉编译环境;第⼆步将需要转换的机器码或者汇编指令写到⼀个.s⽂件中;第三步使⽤as和objdump命令进⾏编译和反汇编;最后你就得到了你要的结果。
1. 配置arm-linux-gcc环境sudo apt-get install gcc-arm-linux-gnueabi //安装arm-linux-gnueabi-gcc -v //检查是否安装成功2. 写⼀个.s⽂件,如下的test.s可以使⽤正确的汇编指令,也可以使⽤伪指令的形式。
以下第⼀句是将0x100A700这个值放到pc中;第⼆句将⽴即数0放到寄存器R0中;第三句相当于RET。
如果是将机器码转换为汇编指令,⽂件中的机器码前要加.inst,并且如果是⼩端的机器码的话,需要将其转换为⼤端的形式,因为实验表明gcc可能是⼤端的。
3. 使⽤as和objdump进⾏编译和反汇编as编译⽣成⽬标⽂件test.o,再将test.o反汇编输出如下。
左右对照机器码和汇编指令,注意这⾥的机器码是⼤端形式,汇编指令是正确的,not伪指令了。
第⼀句伪指令变成了两句汇编指令,数据部分放在了最后,然后将该数据对应的地址赋给pc。
第⼆句汇编指令对应的机器码就是e3a00000(⼤端),0000a0e3(⼩端)。
第四句的机器码对应的汇编指令就是 ldr pc,[pc,#-4]。
附加⼀些在线转换⼯具:Online Assembler and Disassembler【多种架构】:Online x86 / x64 Assembler and Disassembler【仅x86/x64】:Online ARM to HEX Converter【ARM,部分指令,仅可单向转换】:。
Chapter 4 MCS—96指令系统
LD 22H, [30H]; ADDB AL, [BX] 地址寄存器的地址号需是偶数. 3.立即寻址方式 操作数是直接的数据(立即数). LDB 22H, #56H 4.自动增量寻址方式 与寄存器间接寻址方式相似,不同的是指 令执行后地址寄存器的内容视情况增1 或增2. LDB 37H, [20H]+ ; LD AX, [CX]+
Chapter 4 MCS—96
单片机指令系统
Chapter 4 MCS—96单片机 指令系统
第一节 概述
指令系统---微处理器全部指令的集合. 一.指令的格式 指令有两种形式:机器码和汇编指令. 1.机器码的格式 操作码 [操作数] 操作码为1~2个字节. 操作数为0~5个字节.
FE 5F 28 20 24 38 2E 2.汇编指令的格式 其采用了”助记符”而具有很强的可读性. 两个部分.四种格式(视操作数的个数). 注意操作数的排列顺序. ADD 20H, [30H]; 66 30 20 ADD AX, BX, #1234H; 45 34 12 BX AX 二.操作数类型 操作数有三种体现形式:立即数,寄存器,
操作数的类型在指令中的区分:在操作码 上加后缀.如LDB, ADDB, LD. 三.状态标志及PSW 1.状态标志:反映CPU操作结果的某些特 征, 如运算结果是否为零,做加法后有否 进位等. 2.PSW---程序状态字 PSW实际由两器件构成.高字节为状态寄 存器(CPU中);低字节为SFR中的08H即 INT_MASK(中断屏蔽寄存器).
二.数据类型变换指令 将字节操作数传送后扩展为字操作数:按 符号位扩展或按零扩展. 按符号位扩展: LDBSE AX, CL 按零扩展: LDBZE BX, #78H 三.存储指令 是一个较特殊的指令:源和目的的位置与 其它指令相反;可将寄存器数送到存储器 或寄存器. ST 20H, [32H]; STB CL, 22[20H]
arm 32 常见汇编指令 对应的机器码
arm 32 常见汇编指令对应的机器码
ARM 32位汇编指令是一种用于ARM架构的低级编程语言,它将人类可读的汇编指令转换为机器码,从而实现对计算机硬件的直接控制。
以下是几个常见的ARM 32位汇编指令及其对应的机器码:
1. MOV指令:将一个数据从一个位置复制到另一个位置。
机器码:0xMOV Rd, Rn
2. ADD指令:将两个数据相加并将结果存储在目标寄存器中。
机器码:0xADD Rd, Rn, Rm
3. SUB指令:将两个数据相减并将结果存储在目标寄存器中。
机器码:0xSUB Rd, Rn, Rm
4. CMP指令:比较两个数据的大小,并根据比较结果设置条件代码。
机器码:0xCMP Rn, Rm
5. LDR指令:从内存中加载数据到寄存器中。
机器码:0xLDR Rd, [Rn, #offset]
6. STR指令:将寄存器中的数据存储到内存中。
机器码:0xSTR Rd, [Rn, #offset]
7. B指令:无条件跳转到指定的地址。
机器码:0xB label
8. BEQ指令:如果上一次比较结果为相等,则跳转到指定的地址。
机器码:0xBEQ label
以上是ARM 32位汇编指令的一些常见例子,每个指令都有对应的机器码。
通过编写汇编程序,程序员可以直接对计算机硬件进行控制,实现各种功能。
虽然汇编语言比高级语言更难以理解和编写,但它提供了更高的灵活性和效率,特别适合对性能要求较高的应用。
ARM汇编指令集与机器码
ARM汇编指令集与机器码0x00 本⽂⽬标本⽂内容从《ARM Architecture Reference Manual》中截取翻译,可以看作是⼀个重点笔记集。
仅记录博主认为有意思的部分,并加⼊⼀些个⼈理解。
如果发现有不对的地⽅欢迎留⾔指正。
现代的智能⼿机是能进⾏ARM汇编级别交互的最便捷的设备,因此实例分析的内容基于博主的⼩⽶Note+IDA,和某个正在被调试的安卓程序。
该程序加载的SO⽂件使⽤armeabi架构。
0x01 ARM模型与概念ARM⽀持三种数据类型的读写:Byte(8 bits),Halfword(16 bits),Word(32 bits)。
所有内存指令相关的读写操作都会基于这三种数据类型。
ARM使⽤⼩端存储,这意味着例如指令E5 9F 00 90在内存中会反序存储为:0x00a0 90 00 9F E5在读取指令后,会被还原为正序E59F0090。
ARM⼀共⽀持7种处理器模式,程序在编译后所运⾏的绝⼤部分时间⽚中,例如执⾏了⼀段MD5加密函数,都处于usr模式。
寄存器⽰例图,某个程序正在处于调试暂停中。
ARM处理器⼀共有37个之多的寄存器。
在所有的ARM状态模式中,有15个可见寄存器(R0~R14),和1~2个状态寄存器随时可编程交互。
其余没有提到的寄存器,⽤于处理异常、中断等核⼼指令,外部不可见也不能⾃主控制读写。
R0~R7作为不保留寄存器,可以⾃由编程指定其含义。
例如R0~R3最常⽤于参数传递,返回值等保存。
R8~R14是保留寄存器,有⾃⼰的特殊含义,在寄存器实例图中可以看到多半保存和地址相关的值,⼜或者指向了SP地址或LR地址。
通常R13就是SP(Stack Pointer)寄存器,该值指向当前汇编代码段可以使⽤的栈起始地址。
R14作为LR(Link Register)寄存器,保存当前汇编代码段执⾏完毕后,需要回溯到的汇编代码地址。
PC程序计数器是⼀个特殊的寄存器,指向当前正在执⾏的代码地址。
汇编语言-基础知识
汇编语⾔-基础知识汇编语⾔-基础知识汇编语⾔的产⽣计算机作为⼀个只能读懂和执⾏⼆进制的东西,在其刚被发明出时,都是⽤机器语⾔(01⼆进制形式表⽰)来写⼊程序,随着程序越来越复杂,需要更长的组合,不光⼀个微⼩的0->1将会导致错误,以及过于难记忆与分辨。
随后找到了⼀种解决⽅法,将这些最基础⼆进制的指令,⽤⼀串字符表⽰,再由电脑的汇编器(Assembler)将这串字符转化成⼆进制机器语⾔,程序员只需要负责写汇编指令的源代码即可。
汇编语⾔由三部分组成:1. 汇编指令(有与其专门对应的机器码)2. 伪指令(由汇编器执⾏,没有与其专门对应的机器码)3. 其他符号(如+,-,*,/由汇编器执⾏,没有与其专门对应的机器码)程序放在哪⾥CPU是电脑能够运算的核⼼部件,但是想要指挥CPU,需要有指令和数据,储存运⾏中程序的指令和数据的就是常说的内存。
对于磁盘中的数据, CPU⽆法直接直⾏,需要加载到内存中才可以被CPU所使⽤。
指令和数据⼀样,都是⼀串⼆进制码, CPU在⼯作的时候,会根据需要把它们解释成指令或者数据,例如1000101111000011这⼀串⼆进制码,它既可以表⽰数据8BC3_H,⼜可以表⽰指令mov ax, bx (8086CPU中)。
对于内存,⽬前的⽅式均为以8个bit即1byte为最⼩的存储单元(1byte可以保存8位⼆进制数), CPU想从内存中读取或者存储数据,⾸先需要找到要存在内存的地址,传达控制信息是读⼊还是写⼊,以及读或写的数据。
在⼀台计算机中, CPU通过总线,与内存等外部设备进⾏连接,总线可分为三种,分别是地址总线,数据总线以及控制总线,字如其意,地址总线负责找到要读取或者储存的那个位置,数据总线负责数据的传输,控制总线负责传输要执⾏的⾏为是读⼊还是写⼊。
对于8086CPU,他的地址总线有20根,数据总线有16根,也就是说他的寻址空间为2^20Byte,也就是最多可以寻址1MB内存,最多每次只能传输16bit(2Byte)的数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、状态寄存器
PSW(Program Flag)程序状态字寄存器,是一个16位寄存器,由条件码标志(flag)和控制标志构成,如下所示:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF
条件码:
①OF(Overflow Flag)溢出标志。
溢出时为1,否则置0。
②SF(Sign Flag)符号标志。
结果为负时置1,否则置0.
③ZF(Zero Flag)零标志,运算结果为0时ZF位置1,否则置0.
④CF(Carry Flag)进位标志,进位时置1,否则置0.
⑤AF(Auxiliary carry Flag)辅助进位标志,记录运算时第3位(半个字节)产生的进位置。
有进位时1,否则置0.
⑥PF(Parity Flag)奇偶标志。
结果操作数中1的个数为偶数时置1,否则置0.
控制标志位:
⑦DF(Direction Flag)方向标志,在串处理指令中控制信息的方向。
⑧IF(Interrupt Flag)中断标志。
⑨TF(Trap Flag)陷井标志。
二、直接标志转移(8位寻址)
指令格式机器码测试条件如...则转移
JC 72 C=1 有进位
JNC 73 C=0 无进位
JZ/JE 74 Z=1 零/等于
JNZ/JNE 75 Z=0 不为零/不等于
JS 78 S=1 负号
JNS 79 S=0 正号
JO 70 O=1 有溢出
JNO 71 O=0 无溢出
JP/JPE 7A P=1 奇偶位为偶
JNP/IPO 7B P=0 奇偶位为奇
三、间接标志转移(8位寻址)
指令格式机器码测试格式如...则转移
JA/JNBE(比较无符号数) 77 C或Z=0 > 高于/不低于或等于
JAE/JNB(比较无符号数) 73 C=0 >=高于或等于/不低于
JB/JNAE(比较无符号数) 72 C=1 < 低于/不高于或等于
JBE/JNA(比较无符号数) 76 C或Z=1 <=低于或等于/不高于
JG/JNLE(比较带符号数) 7F (S异或O)或Z=0 > 大于/不小于或等于JGE/JNL(比较带符号数) 7D S异或O=0 >=大于或等于/不小于
JL/JNGE(比较带符号数) 7C S异或O=1 < 小于/不大于或等于
JLE/JNG(比较带符号数) 7E (S异或O)或Z=1 <=小于或等于/不大于四、无条件转移指令
操作码伪码指令含义
EB cb JMP rel8 相对短跳转(8位),使rel8处的代码位下一条指令
E9 cw JMP rel16 相对跳转(16位),使rel16处的代码位下一条指令FF /4 JMP r/m16 绝对跳转(16位),下一指令地址在r/m16中给出FF /4 JMP r/m32 绝对跳转(32位),下一指令地址在r/m32中给出EA cb JMP ptr16:16 远距离绝对跳转,下一指令地址在操作数中
EA cb JMP ptr16:32 远距离绝对跳转,下一指令地址在操作数中
FF /5 JMP m16:16 远距离绝对跳转,下一指令地址在内存m16:16中FF/5 JMP m16:32 远距离绝对跳转,下一指令地址在内存m16:32中五、16位/32位寻址方式
操作码伪码指令跳转含义跳转类型跳转的条件(标志位)
0F 87 cw/cd JA rel16/32 大于near (CF=0 and ZF=0)
0F 83 cw/cd JAE rel16/32 大于等于near (CF=0)
0F 82cw/cd JB rel16/32 小于near (CF=1)
0F 86 cw/cd JBE rel16/32 小于等于near (CF=1 or ZF=1)
0F 82cw/cd JC rel16/32 进位near (CF=1)
0F 84 cw/cd JE rel16/32 等于near (ZF=1)
0F 84 cw/cd JZ rel16/32 为0 near (ZF=1)
0F 8F cw/cd JG rel16/32 大于near (ZF=0 and SF=OF)
0F 8D cw/cd JGE rel16/32 大于等于near (SF=OF)
0F 8C cw/cd JL rel16/32 小于near (SF<>OF)
0F 8E cw/cd JLE rel16/32 小于等于near (ZF=1 or SF<>OF)
0F 86cw/cd JNA rel16/32 不大于near (CF=1 or ZF=1)
0F 82cw/cd JNAE rel16/32 不大于等于near (CF=1)
0F 83cw/cd JNB rel16/32 不小于near (CF=0)
0F 87cw/cd JNBE rel16/32 不小于等于near (CF=0 and ZF=0) 0F 83cw/cd JNC rel16/32 不进位near (CF=0)
0F 85cw/cd JNE rel16/32 不等于near (ZF=0)
0F 8E cw/cd JNG rel16/32 不大于near (ZF=1 or SF<>OF)
0F 8C cw/cd JNGE rel16/32 不大于等于near (SF<>OF)
0F 8D cw/cd JNL rel16/32 不小于near (SF=OF)
0F 8F cw/cd JNLE rel16/32 不小于等于near (ZF=0 and SF=OF) 0F 81cw/cd JNO rel16/32 未溢出near (OF=0)
0F 8B cw/cd JNP rel16/32 不是偶数near (PF=0)
0F 89cw/cd JNS rel16/32 非负数near (SF=0)
0F 85 cw/cd JNZ rel16/32 非零(不等于)near (ZF=0) 0F 80cw/cd JO rel16/32 溢出near (OF=1)
0F 8A cw/cd JP rel16/32 偶数near (PF=1)
0F 8A cw/cd JPE rel16/32 偶数near (PF=1)
0F 8B cw/cd JPO rel16/32 奇数near (PF=0)
0F 88cw/cd JS rel16/32 负数near (SF=1)
0F 84 cw/cd JZ rel16/32 为零(等于)near (ZF=1)
注:一些指令操作数的含义说明:
rel8 表示8 位相对地址
rel16 表示16 位相对地址
rel16/32 表示16或32 位相对地址
r/m16 表示16位寄存器
r/m32 表示32位寄存器。