580 likes | 737 Views
Riistvarapõhine programmeerimine. Loeng 6 Andmeteisalduskäsud Biti- ja stringikäsud Sisend/väljundkäsud Siirdekäsud. Andmeedastuskäsud. Andmete laadimine Aadresside laadimine Bit-käsud Stringikäsud. Andmete laadimine I. Mov A, B Xchg A, B Push A Pop A. Mov I. Mov A, B
E N D
Riistvarapõhine programmeerimine Loeng 6 Andmeteisalduskäsud Biti- ja stringikäsud Sisend/väljundkäsud Siirdekäsud
Andmeedastuskäsud • Andmete laadimine • Aadresside laadimine • Bit-käsud • Stringikäsud ID218 Riistvaralähedane programmeerimine
Andmete laadimine I Mov A, B Xchg A, B Push A Pop A ID218 Riistvaralähedane programmeerimine
Mov I Mov A, B mov reg, reg mov mem, reg mov reg, mem mov reg, immidiate data mov mem, immidiate data mov segreg, reg mov segreg, mem ID218 Riistvaralähedane programmeerimine
Mov II ID218 Riistvaralähedane programmeerimine
Mov III D bit encoding D = 0 reg -> mem D = 1 mem -> reg ID218 Riistvaralähedane programmeerimine
Mov IV W bit encoding W = 0 A, B -> 8 bit W = 1 A, B -> 16 bit ID218 Riistvaralähedane programmeerimine
Mov V REG bit encoding ID218 Riistvaralähedane programmeerimine
Mov VI Mod bit encoding ID218 Riistvaralähedane programmeerimine
Mov VII R/M Field Encoding ID218 Riistvaralähedane programmeerimine
Mov VIII Mov reg8, reg8 2 baiti 2 Mov reg16, reg16 2 baiti 2 Mov reg16, mem 2 baiti 8+mem Mov mem, reg16 2 baiti 9+mem Mov reg16, imm.data 4 baiti 4 Mov mem16, imm.data 4 baiti 10+mem Mov segreg,reg16 2 baiti 2 Mov segreg,mem 2 baiti 8+mem ID218 Riistvaralähedane programmeerimine
Mov IX Operandi suurus – byte/word: mov [bx], 0 ; 0 -> [bx] mov byte ptr [bx], 0 mov word ptr [bx], 0 Segment registers: mov ax, 40h mov es, ax ID218 Riistvaralähedane programmeerimine
Andmete laadimine II xchg A, B xchg reg, mem 2 baiti xchg reg, reg 2 baiti xchg ax, reg 1 bait Lippud: ei mõjuta ID218 Riistvaralähedane programmeerimine
Andmete laadimine III push A A -> pinusse push reg16push memory push segregpushf Algoritm: SP := SP - 2 [SS:SP] := 16 bit operand (store result at location SS:SP.) ID218 Riistvaralähedane programmeerimine
Andmete laadimine IV pop A A <- pinust pop reg16pop memory pop segregpopf Algoritm: 16-bit operand := [SS:SP] SP := SP + 2 ID218 Riistvaralähedane programmeerimine
Adressite laadimine I lds reg16, mem32 Agoritm: reg16 := [mem32] ds := [mem32 + 2] ID218 Riistvaralähedane programmeerimine
Adressite laadimine II les reg16, mem32 Algoritm: reg16 := [mem32] es := [mem32 + 2] ID218 Riistvaralähedane programmeerimine
Adressite laadimine III lea reg16, mem Lea ax, 1234h 1234h -> ax Mov ax, 1234h 1234h -> ax ID218 Riistvaralähedane programmeerimine
Adressite laadimine IV lea reg16, mem lea ax, [bx] ; mov ax, bx lea bx, 3[bx] ; add bx, 3 lea ax, 3[bx] ; add bx, 3 ; mov ax, bx ID218 Riistvaralähedane programmeerimine
Adressite laadimine V lea reg16, mem lea bx, 128[bp+di] mov al,[bx] mov al,[bx] mov al,128[bp+di] mov al,128[bp+di] ID218 Riistvaralähedane programmeerimine
Bit-käsud test A, B test bt A, index bit test btc A, index test and complement btr A, index test and reset bts A, index test and set bsf A, B bit scan forward bsr A, B bit scan reverse ID218 Riistvaralähedane programmeerimine
Test test A, B A & B -> FR Lipud: Cf -> 0 Of -> 0 Zf -> vastavalt tulemusele Sf -> vastavalt tulemusele Pf -> vastavalt tulemusele Af -> vastavalt tulemusele ID218 Riistvaralähedane programmeerimine
BT, BTS, BTR, BTC Bt ax, 6 ; bit6 -> Cf Bx = 33 Bt A, bx ; bit 1 of A+4 -> Cf ; effective address + index/8 ID218 Riistvaralähedane programmeerimine
BSF, BSR I bsf A, B ; 0 -> 15 bsr A, B ; 15 -> 0 Kui leitud “1”: Zf = 0, B = Bit index Kui ei leitud_ Zf = 1, B - määramata ID218 Riistvaralähedane programmeerimine
BSF, BSR II Kuidas leida “0”: • Kopeerida operand - mov • Inverteerida operand - not • Otsida “1” - bsf, bsr ID218 Riistvaralähedane programmeerimine
Set – käsud I set**reg8 set**mem8 Set** A kui ** = true, A = 1 kui ** = false, A = 0 ID218 Riistvaralähedane programmeerimine
Set – käsud II SET** Instructions That Test Flags ID218 Riistvaralähedane programmeerimine
Set – käsud III SET** Instructions for Unsigned Comparisons ID218 Riistvaralähedane programmeerimine
Set – käsud IV SET** Instructions for Signed Comparisons ID218 Riistvaralähedane programmeerimine
Set – käsud V Bool := A <= B Bool byte variable A, B signed integer mov ax, A cmp ax, B setle Bool ID218 Riistvaralähedane programmeerimine
Set – käsud VI Bool := ((A <= B) and (D = E)) or (F <> G) mov ax, A cmp ax, B setle bl ; A <= B mov ax, D cmp ax, E sete bh ; D = E and bl, bh ; (A <= B) and (D = E) mov ax, F cmp ax, G setne bh ; F <> G or bl, bh ; * or * mov Bool, bh ID218 Riistvaralähedane programmeerimine
String-käsud I movs (move string) lods (load string element into the accumulator) stos (store accumulator into string element) scas (Scan string and check for match against the value in the accumulator) cmps (compare two strings) ins (input a string from an I/O port) outs (output a string to an I/O port ID218 Riistvaralähedane programmeerimine
String-käsud II rep (repeat a string operation) repz (repeat while zero) repe (repeat while equal) repnz (repeat while not zero) repne (repeat while not equal) ID218 Riistvaralähedane programmeerimine
String-käsud II movs{size - b,w}: es:[di] := ds:[si] if direction_flag = 0 then si := si + size; di := di + size; else si := si - size; di := di - size; endif; ID218 Riistvaralähedane programmeerimine
String-käsud III cmps{size - b,w}: cmp ds:[si], es:[di] if direction_flag = 0 then si := si + size; di := di + size; else si := si - size; di := di - size; endif; ID218 Riistvaralähedane programmeerimine
String-käsud IV lods{size - b,w}: ax/al := ds:[si] if direction_flag = 0 then si := si + size; else si := si - size; endif; ID218 Riistvaralähedane programmeerimine
String-käsud V stos{size - b,w}: es:[di] := ax/al if direction_flag = 0 then di := di + size; else di := di - size; endif; ID218 Riistvaralähedane programmeerimine
String-käsud VI scas{size - b,w}: cmp ax/al, es:[di] if direction_flag = 0 then di := di + size; else di := di - size; endif; ID218 Riistvaralähedane programmeerimine
String-käsud VII ins{size b,w}: es:[di] := port(dx) if direction_flag = 0 then di := di + size; else di := di - size; endif; ID218 Riistvaralähedane programmeerimine
String-käsud VIII outs{size - b,w}: port(dx) := ds:[si] if direction_flag = 0 then si := si + size; else si := si - size; endif; ID218 Riistvaralähedane programmeerimine
Sisend/väljundkäsud I in ax/al, port ; input in ax/al, dx out port, ax/al ; output out dx, ax/al 0 < port < 255 Ei mõjuta lipud ID218 Riistvaralähedane programmeerimine
Sisend/väljundkäsud II Read keyboard from port 60h in al, 60h ;Read Sent ‘data’ to printer port 378h mov dx, 378h ; port to dx mov al, data ; data to al out dx, al ; send ID218 Riistvaralähedane programmeerimine
Siirdekäsud • Tingimatu siire • Tingimussiire • Protseduurid ID218 Riistvaralähedane programmeerimine
Tingimatu siire I jmp A jmp disp8 ;direct intrasegment, 8 bit displacement. jmp disp16 ;direct intrasegment, 16 bit displacement. jmpmem16 ;indirect intrasegment, 16 bit memory operand. jmp reg16 ;register indirect intrasegment. ID218 Riistvaralähedane programmeerimine
Tingimatu siire II mov dx, 378h ;Parallel printer port address. Loop:in al, dx ;Read character from input port. xor al, 1 ;Invert the L.O. bit. out dx, al ;Output data back to port. jmp Loop ;Repeat forever. Loop: Statement label ID218 Riistvaralähedane programmeerimine
Tingimatu siire III WordVar word TargetAddress . . . jmp WordVar mov ip, WordVar ID218 Riistvaralähedane programmeerimine
Tingimatu siire IV jmp ax mov ip, ax ID218 Riistvaralähedane programmeerimine
Tingimussiire I JmpTbl wordiffalse, iftrue . . . mov ax, X cmp ax, Y sete bl jmp JmpTbl[bl*2] ID218 Riistvaralähedane programmeerimine
Tingimussiire II J** A j** disp8 ID218 Riistvaralähedane programmeerimine
Tingimussiire III ID218 Riistvaralähedane programmeerimine