Intel8086ASMCode汇编指令的机器码
- 格式:doc
- 大小:147.50 KB
- 文档页数:5
实验二找出8086/8088指令系统所有指令的操作码的编码实验目的:本实验旨在利用debug工具的e和u功能找出8086/8088指令系统的指令格式中各种操作码编码对应的指令功能,得到8086/8088操作码从00~FF所对应的汇编指令名字。
附:本次实验用到的e和u功能的解释:debug的e命令、u命令的作用及用法:e 100...表示从100号单元开始编写内容;u 100 105表示将100~105号单元共6个字节反汇编出来、所谓“反汇编”就是把机器码还原成汇编语句。
每次先用e命令改写100号单元(从00到FF,第一次是00,第二次是 01,第三次是02,第四次是03,……,最后一次是FF),再用u命令反汇编出指令,再记录下来。
第一回合实验步骤:一、启动debug程序:鼠标单击“开始->程序->附件->命令提示符”,打开DOS(其实虚拟DOS)窗口,出现命令提示符Microsoft Windows XP [版本5.1.2600]<C>版权所有1985-2001 Microsoft Corp.输入debug并按回车键,出现一个debug程序的提示符,一个短杆如下图所示:二、用试探法-e 100 00 00 00 00 00 00-u 100 1051375:0100 0000 ADD [BX+SI],AL1375:0102 0000 ADD [BX+SI],AL1375:0104 0000 ADD [BX+SI],AL结论:操作码字节前六位为000000(二进制)看来是一条ADD指令,而且只占两个字节。
记下来:指令码汇编指令---------------------------------------------------------------------1375:0100 0000 ADD [BX+SI],AL分析:指令的第一字节为操作码,规定指令的操作类型。
8086汇编和机器码的对应表
单⽚机指令功能⼀览表
助记符代码说明
MOV A,Rn E8~EF
寄存器A
MOV A,direct E5 dircet 直接字节送A
MOV A,@Ri ER~E7
间接RAM送A
MOV A,#data 74 data ⽴即数送A
MOV Rn,A F8~FF
A送寄存器
MOV Rn,dircet A8~AF dircet 直接字节送寄存器
MOV Rn,#data 78~7F data ⽴即数送寄存器
MOV dircet,A F5 dircet A送直接字节
MOV dircet,Rn 88~8F dircet 寄存器送直接字节
MOV dircet1,dircet2 85 dircet1 dircet2 直接字节送直接字节MOV dircet,@Ro 86~87
间接RAM送直接字节
MOV dircet,#data 75 dircet data ⽴即数送直接字节MOV @Ri,A F6~F7
A送间接RAM
MOV @Ri,#data 76~77 data 直接字节送间接RAM MOV @Ri,#data 76~77 data ⽴即数送间接RAM
MOV DPTR,#data16 90 data 15~8 16位常数送数据指针data7~0
MOVC A,@A+DPTR 93
由((A)+(DPTR))寻址的程序存贮
器字节选A
MOVC A,@A+PC 83
由((A)+(PC));寻址的程序存贮器字节送A
MOVX A,@Ri E2~E3
送外部数据(8位地址)送A
MOVX A,@DPTR E0
送外部数据(16位地址)送A。
Intel8086ASMCode汇编指令的机器码8086指令码汇总表8086指令有汇编语⾔指令和指令码两种形式,汇编语⾔指令形式经过汇编程序处理后⽣成指令码形式。
通过指令码形式可帮助理解汇编语⾔指令格式的含义和⽤法。
O、8086指令码格式0B/1B 1B或2B 0B/1B 0B/1B/2B/4B 0B/1B/2B/4B 指令前缀操作码段寻址⽅式段偏移量参数⽴即数参数说明:偏移量参数和⽴即数参数的有⽆由寻址⽅式段决定。
⼀、传送类指令MOV指令REG/MEM→/←REG 100010dw mod reg r/mIMME→REG/MEM 1000111w mod 000 r/m data data if w=1 IMME→REG 1011wreg data data if w=1MEM→AX 1010000w addr-low addr-highAX→MEM 1010001w addr-low addr-highREG/MEM→段REG 10001110 mod reg r/m 8E段REG→REG/MEM 10001100 mod reg r/m 8CPUSH指令REG/MEM 11111111 mod 110 r/m FFREG 01010reg段REG 000reg110POP指令REG/MEM 10001111 mod 000 r/m 8FREG 01011reg段REG 000reg111XCHG指令REG/MEM←→REG 1000011w mod reg r/mREG←→AX 10010regXLAT指令11010111 D7LEA指令10001101 mod reg r/m 8DLDS指令11000101 mod reg r/m C5LES指令11000100 mod reg r/m C4LAHF指令10011111 9FSAHF指令10011110 9EPUSHF指令10011100 9CPOPF指令10011101 9DIN指令直接寻址1110010w port间接寻址1110110wOUT指令直接寻址1110011w port间接寻址1110111wCBW指令10011000 98CWD指令10011001 99 说明:d—0/1表⽰REG为源/⽬的操作数;w—0/1表⽰操作数类型为BYTE/WORD;mod、r/m—寻址⽅式,参见教材P56~57;IMME—⽴即数操作数,字段中⽤data表⽰;reg—通⽤REG⽤3位编码,段REG只⽤2位编码(即为0xx)。
微处理器指令系统概述:一台计算机所能识别和执行的全部指令,称为该机器的指令系统,又称指令集。
一般指令分为:“告诉计算机干什么”的指令操作助记符,“指令操作对象”即操作数。
寻址方式概述:指定操作数或操作数存放位置的方法称为寻址方式。
8086的寻址方式有三类:立即寻址、寄存器寻址和存储器寻址;其中存储器寻址又分为直接寻址、寄存器间接寻址、寄存器相对寻址、基址加变址寻址、相对基址加变址寻址五种。
立即寻址:操作数直接写在指令中的寻址方式,因为这种操作数称为立即数,所以这种寻址方式也称为立即数寻址方式。
立即数可以使8位;16位;32位;例如:MOV AX,6789H ADD AX,1234H寄存器寻址:指令所要的操作数事先已存储在某寄存器中,或把目标操作数存入寄存器中,或者源操作数和目标操作数都是寄存器。
例如:MOV AX,BX MOV AX,6789H(源操作数是立即数寻址,目的操作数是寄存器寻址)存储器寻址:在存储器中查找操作数。
1·直接寻址方式:指令所要的操作数存放在内存中,在指令中直接给出操作数的段地址和有效地址,从而使8086的BIU部件能够利用地址加法器得到实际物理地址。
例如:MOV AX,DS:[2000H](mov 默认DS为存放数据的段,所以这个指令等价于MOV AX,[2000H])MOV AX,ES:[2000H]2·寄存器间接寻址方式:操作数在存储器中,操作数的有效地址用SI,DI,BX,BP 4个集训期之一来指定。
若不使用段前缀,则规定若有效地址用SI,DI,BX等之一来指定,则默认的段寄存器是DS,若有效地址用BP来指定,则其默认的段寄存器位SS。
例如:MOV BX,[DI]3·寄存器相对寻址方式:操作数的有效地址是一个基址寄存器(BX,BP)或变址寄存器(SI、DI)的内容和指令中的8/16位偏移量之和。
例如:MOV BX,[SI+100H]4·基址加变址寻址方式:操作数有效地址是一个基址寄存器(BX,BP)和一个变址寄存器(SI,DI)的内容之和。
一、汇编速查MOV AA,BB 将BB 放到AA 里CALL 调用子程序(相当于BASIC 的GOSUB)RET 与RETF 返回程序(相当于BASIC 的RETURN)CMP XX,YY 比较XX 与YYJZ 若相等则转移JNZ 若不相等则转移JB 若小于则转移JG 若大于则转移JMP 无条件转移J??? (各种转移指令)LOOP 循环直到CX为0INT XX 类似CALL 的中断涵数PUSH 推入栈(STACK)ESP:PUSH AXPOP 出栈ESP:POP CXXCHG 交换ESP:XCHG AX,BXIN、OUT 与PORT有关的IN/OUTXLAT 查表LEA 段内偏移量。
ESP:LEA AX,AREA1=MOV AX,OFFSET AREA1 LAHF、SAHF与棋标有关的寄存器AHPUSHF、POPF将棋标入/出栈ADD ESP ADD AX,CX (AX=AX+CX)ADC 加入棋标C的ADDINC ESP INC AX(AX=AX+1)AAA 加法校正SUB、SBB 减法DEC ESP:DEC AX(AX=AX-1)NEG 去补,MUL、IMUL 乘DIV、IDIV 除SHR、SAR、SHL 算术、逻辑位移R=RIGHT L=LEFTOR、XOR、AND 逻辑运算ESP :XOR AX,AX(AX=0)直接标志转移指令格式机器码测试条件如...则转移JC 72 C=1 有进位JNS 79 S=0 正号JNC 73 C=0 无进位JO 70 O=1 有溢出JZ/JE 74 Z=1 零/等于JNO 71 O=0 无溢出JNZ/JNE 75 Z=0 不为零/不等于JP/JPE 7A P=1 奇偶位为偶JS 78 S=1 负号JNP/IPO 7B P=0 奇偶位为奇间接标志转移指令格式机器码测试格式如...则转移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 <= 小于或等于/不大于无条件转移指令JMP指令格式执行操作机器码说明段内直接短转移Jmp short (IP)←(IP)+8位位移量EB 转移范围-128到+127字节段内直接近转移Jmp near (IP)←(IP)+16位位移量E9 转移到段内的任一位置段内间接转移Jmp word (IP)←(有效地址EA) FF段间直接(远)转移Jmp far (IP)←(偏移地址)(CS)←(段地址) EA段间间接转移Jmp dword (IP)←(EA)(CS)←(EA+2)二、断点设置表一般处理:bpx hmemcpy(万能断点)bpx MessageBox bpx MessageBoxExAbpx MessageBeep bpx SendMessagebpx GetDlgItemT ext bpx GetDlgItemIntbpx GetWindowText bpx GetWindowWordbpx GetWindowInt bpx DialogBoxParamAbpx CreateWindow bpx CreateWindowExbpx ShowWindow bpx UpdateWindowbmsg xxxx wm_move bmsg xxxx wm_gettext bmsg xxxx wm_command bmsg xxxx wm_activate bmsg xxxx wm_create bmsg xxxx wm_destroy时间相关:bpint 21 if ah==2A (DOS)bpx GetLocalTimebpx GetFileTimebpx GetSystemtimeCD-ROM 或磁盘相关:bpint 13 if ah==2 (DOS) bpint 13 if ah==3 (DOS) bpint 13 if ah==4 (DOS)bpx GetFileAttributesA bpx GetFileSizebpx GetDriveType bpx GetLastErrorbpx ReadFilebpio -h (Your CD-ROM Port Address) R软件狗相关:bpio -h 278 R bpio -h 378 R文件访问相关:bpint 21 if ah==3dh (DOS) bpint 31 if ah==3fh (DOS) bpint 21 if ah==3dh (DOS)bpx ReadFile bpx WriteFilebpx CreateFile bpx SetFilePointerbpx GetSystemDirectoryINI 初始化文件相关:bpx GetPrivateProfileString bpx GetPrivateProfileIntbpx WritePrivateProfileString bpx WritePrivateProfileInt注册表相关:bpx RegCreateKey bpx RegDeleteKeybpx RegCloseKey bpx RegOpenKeybpx RegQueryvalue注册标志相关: bpx cs:eip if EAX==0内存标准相关: bpmb cs:eip rw if 0x30:0x45AA==0显示相关: bpx 0x30:0x45AA do "d 0x30:0x44BB"bpx CS:0x66CC do "? EAX"利用S命令设断:S [-cu][address L length data-list]address :搜索的起始地址length :搜索的长度(字节长)data-list :可以是一系列字节,也可以是字符串, 字符串可以用单引号或双引号括住例如:S 30:0 L ffffffff '********'三、经典句式1 mov eax [ ] 这里可以是地址,也可以是其它寄存器mov edx [ ] 同上通常这两个地址就储存着重要信息call 00??????test eax eaxjz(jnz)2 mov eax [ ] 这里可以是地址,也可以是其它寄存器mov edx [ ] 同上通常这两个地址就储存着重要信息call 00??????jne(je)3 mov eax [ ]mov edx [ ]cmp eax,edxjnz(jz)或者begin: mov al [ ]mov cl [ ]cmp al,cljnz(jz)mov al [ +1]mov cl [ +1]cmp al,cljnz(jz)cmp eax ecx (eax为计数器)jnl beginmov al 014 lea edi [ ]lea esi [ ]repz cmpsdjz(jnz)5 mov eax [ ] 这里可以是地址,也可以是其它寄存器mov edx [ ] 同上通常这两个地址就储存着重要信息call 00??????setz (setnz) al (bl,cl…)6 mov eax [ ] 这里可以是地址,也可以是其它寄存器mov edx [ ] 同上通常这两个地址就储存着重要信息call 00??????test eax eaxsetz (setnz) bl,cl…7 call 00?????? ***push eax (ebx,ecx…)……call 00??????pop eax (ebx,ecx…)test eax eaxjz(jnz)intel x86 类NOP 指令列表(修订版)bkbll(bkbll@)2003/09/10这篇文章是无聊的时候写的, 因为看到phrack 61上面的fake-nop的东东, 觉得有意思.后来又受到eyas(cooleyas@)的启发,从intel指令手册上找了找,下面是我试验通过可以替换NOP的指令.注1: 这里不考虑双字节或以上的指令的fake-nop编码.注2: eyas加了xchg指令.16进制机器码x86汇编指令指令意义可能影响的寄存器或标志位-------------- ------------- ------------------- ---------------------------06 PUSHL %es es进栈esp0E PUSHL %cs cs进栈esp16 PUSHL %ss ss进栈esp1E PUSHL %ds ds进栈esp27 DAA 加法小数位调整AF CF PF SF ZF AL2F DAS 减法小数位调整AF CF PF SF ZF AL37 AAA 加法的ASCII调整AF CF AL3F AAS 减法小数位调整AF CF AL40 INC %eax %eax加1 AF OF PF SF ZF eax41 INC %ecx %ecx加1 AF OF PF SF ZF ecx42 INC %edx %edx加1 AF OF PF SF ZF edx43 INC %ebx %ebx加1 AF OF PF SF ZF ebx44 INC %esp %esp加1 AF OF PF SF ZF esp45 INC %ebp %ebp加1 AF OF PF SF ZF ebp46 INC %esi %esi加1 AF OF PF SF ZF esi47 INC %edi %edi加1 AF OF PF SF ZF edi48 DEC %eax %eax减1 AF OF PF SF ZF eax49 DEC %ecx %ecx减1 AF OF PF SF ZF ecx 4A DEC %edx %edx减1 AF OF PF SF ZF edx 4B DEC %ebx %ebx减1 AF OF PF SF ZF ebx 4C DEC %esp %esp减1 AF OF PF SF ZF esp 4D DEC %ebp %ebp减1 AF OF PF SF ZF ebp 4E DEC %esi %esi减1 AF OF PF SF ZF esi4F DEC %edi %edi减1 AF OF PF SF ZF edi50 PUSHL %eax eax进栈esp51 PUSHL %ecx ecx进栈esp52 PUSHL %edx edx进栈esp53 PUSHL %ebx ebx进栈esp54 PUSHL %esp esp进栈esp55 PUSHL %ebp ebp进栈esp56 PUSHL %esi esi进栈esp57 PUSHL %edi edi进栈esp90 NOP (NULL) (NULL)91 XCHG %ecx,%eax 交换寄存器内容eax,ecx92 XCHG %edx,%eax 交换寄存器内容edx,eax93 XCHG %ebx,%eax 交换寄存器内容ebx,eax95 XCHG %ebp,%eax 交换寄存器内容ebp,eax96 XCHG %esi,%eax 交换寄存器内容esi,eax97 XCHG %edi,%eax 交换寄存器内容edi,eax98 CBW 将byte的AL转换成word的EAX EAX9B WAIT 等待CPU处理完数据(NULL)D6 无效指令(NULL) (NULL)F5 CMC 转换CF标志位(开关) CFF8 CLC 清CF位(CF=0) CFF9 STC 设置CF位(CF=1) CFFC CLD 设置DF位(DF=1) DFFD STD 清理DF位(DF=0) DF1. 上面利用XCHG/PUSHL/INC/DEC的方法程序应该不会出错, 可以正常到目的, 但寄存器内容被改变了.inc eax就改变了eax的值,只能算无奈的办法.2. 利用改变标志寄存器位是个不错的想法, 基本上不会影响流程, 但看到还是改变了CPU的东西还是不满意.3. \x90(NOP),\x9b(wait),\xd6(bad) 这三个指令不错, 都不会改变程序的流程, 又不会改变寄存器的东东.这里尤其指明的是\xd6指令, 在intel手册上没查到对应什么指令, 但在linux下和windows下发现系统对于这个是继续执行下一条指令,和NOP相似.在我看来,上面这些指令利用顺序优先级最好是:\x90(NOP) > \xd6 > \x9b > 改变标志寄存器的操作指令> INC/DEC/PUSHL/XCHG//thx to eyas。
8086指令码汇总表
8086指令有汇编语言指令和指令码两种形式,汇编语言指令形式经过汇编程序处理后生成指令码形式。
通过指令码形式可帮助理解汇编语言指令格式的含义和用法。
O、8086指令码格式
一、传送类指令
w—0/1表示操作数类型为BYTE/WORD;
mod、r/m—寻址方式,参见教材P56~57;
IMME—立即数操作数,字段中用data表示;
reg—通用REG用3位编码,段REG只用2位编码(即为0xx)。
二、算术运算类指令
REG/MEM-REG—MEM可为减数或被减数。
三、逻辑运算类指令
四、控制转移类指令
JAE/JNB—与JNC指令相同;
type—中断类型号。
五、串操作类指令
STOS,REPZ对应CMPS、SCAS(比较两者与5条指令配合时的有效性)。
六、处理器控制类指令。