250 likes | 866 Views
Chapter four 80x86 Instruction Set ( 1 ). Instruction Encodings.
E N D
Chapter four80x86 Instruction Set(1) 2014年3月11日1
Instruction Encodings The 80x86 uses a binary encoding for each machine operation. While it is important to have a general understanding of how the 80x86 encodes instructions, it is not important that you memorize the encodings for all the instructions in the instruction set. If you were to write an assembler or disassembler (debugger), you would definitely need to know the exact encodings. For general assembly language programming, however, you won’t need to know the exact encodings. However, as you become more experienced with assembly language you will probably want to study the encodings of the 80x86 instruction set. Certainly you should beaware of such terms as opcode, mod-reg-r/m byte, displacement value, and so on. 2014年3月11日2
Machine Language Codes • Each instruction is coded as one or more bytes • The first byte is generally an OpCode • A numeric code representing a particular instruction or class of instructions • Additional bytes may affect the action of the instruction or provide information about the data acted upon by the instruction 2014年3月11日3
Opcode d w mod reg r/m Variable Format Instructions • The meaning of bits in an instruction varies depending on the instruction • The number of bytes in an instruction varies depending on the needs of the instruction • Basic 8086 instruction format low disp/data hi disp/data low data hi data 2014年3月11日4
Opcode d w Opcode • 8086 Opcodes are 6, 7, or 8 bits • d(irection) bit - used for instructions that code a register as one of the operands • 1 = register is destination, 0 = register is source • w(idth) bit - used to distinguish byte(0)/word(1) operands • 7-bit opcodes do not use d, 8-bit opcodes do not use either d or w 2014年3月11日5
mod reg r/m mod/reg/r/m • The second byte of some instructions is divided into three fields • The reg field, together with the w bit (in the opcode), specifies a register operand • If there is only one register operand, d specifies whether it is the source or destination • If there are two registers, reg specifies the destination register 2014年3月11日6
reg w=1 w=0 000 AX AL 001 CX CL 010 DX DL 011 BX BL 100 SP AH 101 BP CH 110 SI DH 111 DI BH The reg field contains a number between 0 and 7. Depending on the w-bit setting, this selects one of 8 registers as an operand used by the instruction reg 2014年3月11日7
register/memory • Interpretation depends on mod field contents • mod = 11 r/m=(same code as reg) • second operand is the specified register • mod = 00 r/m=110 • second argument is the address specified in the the next two bytes of the instruction, direct near addressing - DS:offset (Unless segment override is in effect) 2014年3月11日8
All other combinations specify indirect addressing Target Address = [BX/BP]+[SI/DI]+disp mod specifies the size of the displacement which is coded in the next one or two bytes of the instruction mod r/m mode 00 110 direct 00 --- no disp 01 all byte disp 10 all word disp 11 all register (see next table) More mod/r/m 2014年3月11日9
r/m seg addr 000 DS BX+SI 001 DS BX+DI 010 SS BP+SI 011 SS BP+DI 100 DS SI 101 DS DI 110 SS BP 111 DS BX if mod = 01 or 10 disp is added if mod = 00 no displacement Exception: mod = 00 and r/m = 110 direct addressing using a 16-bit offset and DS register Indirect Address Modes 2014年3月11日10
Immediate Operands • Data is stored in the instruction in the byte or bytes immediately following the address information • If bytes 3 or 4 contain a displacement the data follows the displacement info • data may be a single byte or a word 2014年3月11日11
Disclaimer • Not all instructions conform to the formats described so far! The 8086 instruction set is very complex. Some opcodes are only 4-5 bits in length, and others are 16-bits. We have hit only the highlights here. 2014年3月11日12
MOV mov reg,reg 2 100010dw modregr/m mov reg,mem 3-4 100010dw modregr/m disp(1-2) mov reg,imm 2-3 1011wreg data(1-2) mov acc,mem 3 1010000w disp(2) mov mem,acc 3 1010001w disp(2) mov mem,imm 4-6 1100011w modregr/m disp(1-2) data(1-2) 2014年3月11日13
Sample Machine Codes 0000 000A a dw 10 0002 00 b db ? .code 0000 8B DF mov bx,di 0002 8A F9 mov bh,cl 0004 8B 1E 0000 R mov bx,a 0008 8A 26 0002 R mov ah,b 000C 8B 12 mov dx,[si][bp] 000E A0 0002 R mov al,b 0011 8A 26 0002 R mov ah,b 0015 BB 0003 mov bx,3 0018 B1 03 mov cl,3 001A C7 06 0000 R 0064 mov a,100 0020 C6 06 0002 R FF mov b,255 2014年3月11日14
PC-Relative Addressing • The jump instructions use an addressing mode called PC-relative or self-relative • The machine code contains a displacement that is added to the current IP to cause a jump to occur • The assembler must calculate this displacement 2014年3月11日15
JMP • Direct intrasegment short • 11101011 disp • Direct intrasegment (near) • 11101001 disp-low disp-high • Indirect intrasegment • 11111111 mod 100 r/m • Indirect intersegment • 11111111 mod 101 r/m • Direct intersegment (far) • 11101010 offset-low offset-high seg-low seg-high 2014年3月11日16
003C LP: ... 0054 JMP LP ... 010C JMP ELP ... 0406 ELP: 0406 JMP XYZ disp=3C-56=E6 11101011 11100110 disp=406-10E=2F8 * disp=406-10F=2F7 11101001 11110111 00000010 Assume XYZ is a far label at 01C5:0094 EA 94 00 C5 01 JMP Example 2014年3月11日17
Conditional Jumps • These are always 2 bytes (8086-80286) • opcode disp • JA: 01110111 disp • JE: 01110100 disp • Jwhatever: 0111xxxx disp • 80386 and later processors allow near jumps • opcode is 1000xxxx disp-lo disp-hi 2014年3月11日18
100010DW mod reg r/m disp8 100010 0 0 11111010 01 001 001 1000 1000 0100 1001 1111 1010 例:写出下面指令的机器语言编码。 MOV [BX+DI-6],CL =88H、49H、FAH 2014年3月11日19
000000DW mod reg r/m Disp-L Disp-H 000000 1 1 00100110 00001000 10 000 001 0000 0011 1000 0001 0010 0110 0000 1000 例: 写出下面指令的机器语言编码。 ADD AX,[BX+DI-0826] 03H 81H 26H 08H 2014年3月11日20
Addressing Modes on the x86 This is one of the most important issues for your studying of the assembly language programming “寻址方式”是你学习汇编语言指令及程序设计的基础!!! 2014年3月11日21
Addressing Modes on the x86 • The x86 instructions use THREE different operand types: • Constants(立即数寻址方式) mov al, 30h • registers(寄存器寻址方式) mov ah,al • memory addressing(存储器寻址方式) mov [2000h],al 2014年3月11日22
8086/8088的寻址方式 所谓寻址方式就是寻找操作数存放地址(位置)的方法。在8086/8088系统中操作数存放的位置用以下3种: ⑴ 操作数包含在指令字节中。即指令格式中操作数部分就是操作数本身。这种操作数叫立即数操作数。 ⑵ 操作数存放在CPU的某个内部寄存器中。这种操作数叫寄存器操作数。 ⑶ 操作数在内存的数据区中。这种操作数叫存储器操作数。 2014年3月11日23
存储器 AH AL 存储器 AL 80H 12 34 操作码字节 指 令 码 指 令 码 操作码字节 34H 34 80H 80H 12H 12 在8086/8088系统中,操作数又可分为两大类:数据操作数和地址操作数。因此,寻址方式也分为数据寻址方式和地址寻址方式两大类。 1. 数据的寻址方式 1)立即数寻址方式 例如:MOV AL, 80H MOV AX, 1234H 2014年3月11日24
2)寄存器寻址方式 例如:MOV AX, CX 存储器 AX 89 CX 指令码 (包括操作数) C1 2014年3月11日25