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。
汇编指令和机器码的对应表汇编2010-04-20 21:07:19 阅读259 评论0 字号:大中小订阅一、汇编速查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)********************************************************************************************************************************/article/2/2300.shtm汇编指令与机器码的相互转换(转载)查看上面的网址。
8086汇编语言8086汇编语言是一种用于编写Intel 8086微处理器的程序的低级语言。
它是x86指令集的最早版本,是现代PC上使用的汇编语言的基础。
本文将介绍8086汇编语言的基本概念、指令系统、程序格式、程序设计方法和应用实例,以帮助读者掌握这门古老而强大的语言。
什么是8086汇编语言8086汇编语言是一种用助记符表示机器指令的语言,它可以直接操作CPU、寄存器、内存和端口等硬件资源。
8086汇编语言的优点是执行速度快、占用空间少、控制能力强,缺点是可读性差、可移植性差、编程难度大。
8086汇编语言的程序由三个部分组成:伪指令、指令和数据。
伪指令是用来告诉汇编程序如何处理源程序的命令,如定义变量、分配内存、设置段属性等。
指令是用来控制CPU执行操作的命令,如数据传送、算术运算、逻辑运算、控制转移等。
数据是用来存储或操作的信息,如常数、变量、字符串等。
8086汇编语言的程序需要经过汇编程序(如MASM)将源代码转换为机器代码,然后再由链接程序(如LINK)将多个目标模块连接成可执行文件,最后由加载程序(如DOS)将可执行文件加载到内存中运行。
8086微处理器8086微处理器是Intel公司于1978年推出的一款16位微处理器,它是x86系列微处理器的第一代产品,也是IBM PC机的原始CPU。
它具有以下特点:工作频率为5MHz~10MHz,每秒可执行约33万条指令内部结构由总线接口单元(BIU)和执行单元(EU)组成,实现了取指和执行的并行操作寄存器由四个16位通用寄存器(AX, BX, CX, DX)、四个16位段寄存器(CS, DS, SS, ES)、一个16位标志寄存器(FLAGS)和一个16位指令指针(IP)组成指令系统由100多条指令组成,分为数据传送类、算术运算类、位操作类、控制转移类和处理机控制类五大类存储器管理采用了分段机制,每个段最大为64KB,总容量为1MB支持两种工作模式:实地址模式和保护模式,实地址模式下可以直接访问物理地址,保护模式下可以实现多任务和内存保护8086汇编语言程序格式8086汇编语言程序一般采用以下格式:[段名] segment [段属性][伪指令][数据][子程序][段名] ends其中:段名是用来标识一个段的名称,可以自定义,但不能与伪指令或寄存器重名段属性是用来设置一个段的类型和特征,如代码段(code)、数据段(data)、堆栈段(stack)等伪指令是用来定义变量、分配内存、设置偏移量等功能的命令,如DB, DW, DD, ORG, ASSUME等数据是用来存储或操作的信息,如常数、变量、字符串等子程序是用来实现特定功能的代码段,如输入输出、排序、查找等一个典型的8086汇编语言程序由以下三个段组成:数据段(data segment):用来存放程序中用到的数据,如变量、常量、字符串等代码段(code segment):用来存放程序中的指令,如数据传送、算术运算、控制转移等堆栈段(stack segment):用来存放程序中的临时数据,如函数调用时的参数、返回地址、局部变量等一个简单的8086汇编语言程序示例如下:data segmentmsg db 'Hello, world!', '$' ;定义一个字符串变量data endscode segmentassume cs:code, ds:data ;告诉汇编程序代码段和数据段的名称start: ;程序入口标号mov ax, data ;将数据段地址加载到ax寄存器mov ds, ax ;将ax寄存器的值传送到ds寄存器,设置数据段寄存器mov dx, offset msg ;将字符串变量的偏移地址加载到dx寄存器mov ah, 9 ;设置ah寄存器为9,表示调用DOS中断的输出字符串功能int 21h ;调用DOS中断21h,输出字符串mov ah, 4ch ;设置ah寄存器为4ch,表示调用DOS中断的退出程序功能int 21h ;调用DOS中断21h,退出程序code endsend start ;告诉汇编程序程序结束的位置8086汇编语言指令系统8086汇编语言指令系统由100多条指令组成,分为五大类:数据传送类:用来实现数据在寄存器、内存和端口之间的传送,如MOV, PUSH, POP, XCHG等算术运算类:用来实现数据的加减乘除等运算,如ADD, SUB, MUL, DIV等位操作类:用来实现数据的位移、旋转、逻辑和测试等操作,如SHL, SHR, ROL, ROR, AND, OR, XOR, NOT, TEST等控制转移类:用来实现程序的顺序、条件和无条件跳转,如JMP, JZ, JNZ, JCXZ, CALL, RET等处理机控制类:用来实现处理机状态的设置和查询,如CLC, STC, CMC, CLD, STD, CLI, STI等每条指令由助记符和操作数组成,助记符表示指令的功能,操作数表示指令的对象。
8086汇编语⾔学习(⼀)8086汇编介绍1. 学习汇编的⼼路历程 进⾏8086汇编的介绍之前,想先分享⼀下我学习汇编的⼼路历程。
rocketmq的学习 其实我并没有想到这么快的就需要进⼀步学习汇编语⾔,因为汇编对于我的当前的⼯作内容来说太过底层。
但在⼏个⽉前,当时我正尝试着阅读rocketmq的源码。
和许多流⾏的java中间件、框架⼀样,rocketmq底层的⽹络通信也是通过netty实现的。
但由于我对netty并不熟悉,在⼯作中使⽤spring-cloud-gateway的时候甚⾄写出了⼀些导致netty内存泄漏的代码,却不太明⽩个中原理。
出于我个⼈的习惯,在学习源码时,抛开整体的程序架构不论,希望⾄少能对其中涉及到的底层内容有⼀个⼤致的掌握,能让我像⿊盒⼦⼀样去看待它们。
趁热打铁,我决定先学习netty,这样既能在⼯作时更好的定位、解决netty相关的问题,⼜能在研究依赖netty的开源项⽬时更加得⼼应⼿。
netty的学习 随着对netty学习的深⼊,除了感叹netty统⼀规整的api接⼝设计,内部交互灵活可配置、同时⼜提供了⾜够丰富的开箱即⽤组件外;更进⼀步的,netty或者说java nio涉及到了许多更底层的东西,例如:io多路复⽤,零拷贝,事件驱动等等。
⽽这些底层技术在redis,nginx,node-js等以⾼效率io著称的应⽤中被⼴泛使⽤。
扪⼼⾃问,⾃⼰在多⼤程度上理解这些技术?为什么io多路复⽤在io密集型的应⽤中,效率能够⽐之传统的同步阻塞io显著提⾼?⼀次⽹络或磁盘的io传输内部到底发⽣了什么,零拷贝到底快在了哪⾥? 如果没有很好的弄明⽩这些问题,那么我的netty学习将是不完整的。
我有限的知识告诉我,答案就在操作系统中。
操作系统作为软硬件的⼤管家,对上提供应⽤程序接⼝(程序员们通常使⽤⾼级语⾔提供的api间接调⽤);对下控制硬件(cpu、内存、磁盘⽹卡等外设);依赖硬件提供控制并发的系统原语;其牵涉的许多模块内容都已经独⽴发展了(多系统进程间通信->计算机⽹络、⽂件系统->数据库)。
第3章8086微机机器语言指令 教学目标:掌握数据操作数的寻址方式;掌握数据传送指令、加减运算指令、位操作指令的功能与用法;了解其它指令的作用。
教学重点:常用指令的功能与用法。
教学难点:指令的应用。
3.1.1 指令格式一条指令是一个有意义的二进制代码序列,它是机器语言的一个语句,其基本格式为:操作码字段操作码字段OP OP 地址码字段地址码字段AA ——操作码表明了指令的功能及操作,——地址码又称操作数字段,指明了参与操作运算的操作数地址。
1. 指令操作码 指令系统中每条指令都有唯一确定的操作码。
操作码的位数越多,所能表达的操作种类就越多。
(1) 规整型操作码字段的长度和位置固定,又称定长编码,编码最简单。
◆定长编码多用在大中型计算机上,如IBM 370机指令操作码都为8bit(位)。
RISC 指令集采用定长编码。
◆定长编码有利于简化硬件设计、减少指令译码时间;但往往造成资源浪费(冗余)。
(2) 非规整型非规整型操作码的长度不定,且分散在指令字的不同位置上,因此又称变长编码。
变长编码广泛用在小型、微型计算机上,如PDP 小型机。
CISC 指令集是非规整型编码。
1. 指令操作码(续)扩展操作码法:灵活充分利用指令的各个字段,在不增加指令长度的情况下,扩展操作码能表示更多的指令。
80x86微处理器采用扩展操作码法。
变长编码增加指令译码的难度,控制器的设计较复杂。
2. 指令地址码每条指令必须包括CPU执行所需的全部信息。
对双操作数指令,除了操作码OP(Operate)外,还必须包含:第一源操作数地址A1(Address1)、第二源操作数地址A2、操作结果的存放地址A3,以及下条指令在内存中的存放地址A4。
程序计数器PC(Program counter)来指向要执行指令的地址,现代计算机地址码字段有四种结构:三地址、双地址、单地址和零地址。
OP A1 A2 A3;操作为:[A1] OP [A2] →A3,三地址指令格式:OP A1 A2 A3PC+1→PC(隐含)三地址指令在小型、微型计算机中很少使用。
实验报告一、实验目的利用debug工具的e和u功能找出8086/8088指令系统的指令格式中各种操作码编码对应的指令功能。
二、实验内容(第一回合)一、用试探法-e 100 00 00 00 00 00 00(e 100...表示从100号单元开始编写内容)(我们将第2~6字节全部固定为00)-u 100 105 (u 100 105表示将100~105号单元共6个字节反汇编出来,(所谓“反汇编”就是把机器码还原成汇编语句))0AE9:0100 0000 ADD [BX+SI],AL0AE9:0102 0000 ADD [BX+SI],AL0AE9:0104 0000 ADD [BX+SI],AL结论:操作码字节前六位为000000(二进制)看来是一条ADD指令,而且只占两个字节。
记下来:指令码汇编指令---------------------------------------------------------------------0AE9:0100 0000 ADD [BX+SI],AL二、将指令首字节变为01,重复以上实验-e 100 01 00-u 100 1010AE9:0100 0100 ADD [BX+SI],AX结论:第1字节由00(二进制0000 0000)变为01(二进制0000 0001),ADD指令的第二个操作数由AL变为了AX。
AL为8位寄存器、AX为16位寄存器,印证了W字段的作用,增加一条有用的记录:指令码汇编指令-------------------------------------------------------------------------0AE9:0100 0000 ADD [BX+SI],AL0AE9:0100 0100 ADD [BX+SI],AX三、将指令首字节变为02,重复以上实验-e 100 02 00-u 100 1010AE9:0100 0200 ADD AL,[BX+SI]第1字节由00(二进制0000 0000)变为02(二进制0000 0010),ADD 操作的传送方向发生转变,印证了D字段的作用。
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条指令配合时的有效性)。
六、处理器控制类指令。