diff --git a/Compiler b/Compiler index 245bd03..86eb7f0 100644 Binary files a/Compiler and b/Compiler differ diff --git a/Compiler.exe b/Compiler.exe index 20e7346..2f3f4aa 100644 Binary files a/Compiler.exe and b/Compiler.exe differ diff --git a/source/RVM32I.ob07 b/source/RVM32I.ob07 index a584e3f..260fc65 100644 --- a/source/RVM32I.ob07 +++ b/source/RVM32I.ob07 @@ -29,22 +29,22 @@ CONST GPRs = {0 .. 2} + {5 .. numGPRs + 1}; - opSTOP = 0; opRET = 1; opENTER = 2; opNEG = 3; opNOT = 4; opABS = 5; + opSTOP = 0; opRET = 1; opENTER = 2; opNEG = 3; opNOT = 4; opNOP = 5; opXCHG = 6; opLDB = 7; opLDH = 8; opLDW = 9; opPUSH = 10; opPUSHC = 11; - opPOP = 12; opLABEL = 13; opLEA = 14; opLLA = 15; opJNA = 16; opJGA = 17; - opJLA = 18; opJMP = 19; opCALL = 20; opCALLI = 21; + opPOP = 12; opLABEL = 13; opLEA = 14; opLLA = 15; (* 16, 17, 18 *) + opJMP = 19; opCALL = 20; opCALLI = 21; opMOV = 22; opMUL = 24; opADD = 26; opSUB = 28; opDIV = 30; opMOD = 32; - opSTB = 34; opSTH = 36; opSTW = 38; opINCL = 40; opEXCL = 42; - opIN = 44; opAND = 46; opOR = 48; opXOR = 50; opASR = 52; opLSR = 54; - opLSL = 56; opROR = 58; opMIN = 60; opMAX = 62; opCMP = 64; + opSTB = 34; opSTH = 36; opSTW = 38; (* 40, 42, 44 *) + opAND = 46; opOR = 48; opXOR = 50; opASR = 52; opLSR = 54; + opLSL = 56; opROR = 58; (* 60, 62 *) opCMP = 64; opMOVC = 23; opMULC = 25; opADDC = 27; opSUBC = 29; opDIVC = 31; opMODC = 33; - opSTBC = 35; opSTHC = 37; opSTWC = 39; opINCLC = 41; opEXCLC = 43; - opINC = 45; opANDC = 47; opORC = 49; opXORC = 51; opASRC = 53; opLSRC = 55; - opLSLC = 57; opRORC = 59; opMINC = 61; opMAXC = 63; opCMPC = 65; + opSTBC = 35; opSTHC = 37; opSTWC = 39; (* 41, 43, 45 *) + opANDC = 47; opORC = 49; opXORC = 51; opASRC = 53; opLSRC = 55; + opLSLC = 57; opRORC = 59; (* 61, 63 *) opCMPC = 65; - opSYSCALL = 67; opJBT = 68; opADDRC = 69; + opBIT = 66; opSYSCALL = 67; opJBT = 68; opADDRC = 69; opJEQ = 70; opJNE = 71; opJLT = 72; opJGE = 73; opJGT = 74; opJLE = 75; opSEQ = 76; opSNE = 77; opSLT = 78; opSGE = 79; opSGT = 80; opSLE = 81; @@ -257,11 +257,37 @@ BEGIN END jcc; +PROCEDURE shift1 (op, param: INTEGER); +VAR + r1, r2: INTEGER; + +BEGIN + r2 := GetAnyReg(); + Emit(opMOVC, r2, param); + BinOp(r1, r2); + Emit(op, r2, r1); + mov(r1, r2); + drop +END shift1; + + +PROCEDURE shift (op: INTEGER); +VAR + r1, r2: INTEGER; + +BEGIN + BinOp(r1, r2); + Emit(op, r1, r2); + drop +END shift; + + PROCEDURE translate; VAR cmd, next: IL.COMMAND; opcode, param1, param2: INTEGER; r1, r2, r3: INTEGER; + label: INTEGER; BEGIN cmd := IL.codes.commands.first(IL.COMMAND); @@ -651,56 +677,28 @@ BEGIN Emit(opNOT, r1, 0) |IL.opASR: - BinOp(r1, r2); - Emit(opASR, r1, r2); - drop + shift(opASR) |IL.opLSL: - BinOp(r1, r2); - Emit(opLSL, r1, r2); - drop + shift(opLSL) |IL.opROR: - BinOp(r1, r2); - Emit(opROR, r1, r2); - drop + shift(opROR) |IL.opLSR: - BinOp(r1, r2); - Emit(opLSR, r1, r2); - drop + shift(opLSR) |IL.opASR1: - r2 := GetAnyReg(); - Emit(opMOVC, r2, param2); - BinOp(r1, r2); - Emit(opASR, r2, r1); - mov(r1, r2); - drop + shift1(opASR, param2) |IL.opLSL1: - r2 := GetAnyReg(); - Emit(opMOVC, r2, param2); - BinOp(r1, r2); - Emit(opLSL, r2, r1); - mov(r1, r2); - drop + shift1(opLSL, param2) |IL.opROR1: - r2 := GetAnyReg(); - Emit(opMOVC, r2, param2); - BinOp(r1, r2); - Emit(opROR, r2, r1); - mov(r1, r2); - drop + shift1(opROR, param2) |IL.opLSR1: - r2 := GetAnyReg(); - Emit(opMOVC, r2, param2); - BinOp(r1, r2); - Emit(opLSR, r2, r1); - mov(r1, r2); - drop + shift1(opLSR, param2) |IL.opASR2: UnOp(r1); @@ -728,7 +726,11 @@ BEGIN |IL.opABS: UnOp(r1); - Emit(opABS, r1, 0) + Emit(opCMPC, r1, 0); + label := IL.NewLabel(); + Emit(opJGE, label, 0); + Emit(opNEG, r1, 0); + Emit(opLABEL, label, 0) |IL.opLEN: UnOp(r1); @@ -761,17 +763,20 @@ BEGIN |IL.opENDSW: |IL.opCASEL: - Emit(opJLA, param1, param2) + Emit(opCMPC, ACC, param1); + Emit(opJLT, param2, 0) |IL.opCASER: - Emit(opJGA, param1, param2) + Emit(opCMPC, ACC, param1); + Emit(opJGT, param2, 0) |IL.opCASELR: + Emit(opCMPC, ACC, param1); IF param2 = cmd.param3 THEN - Emit(opJNA, param1, param2) + Emit(opJNE, param2, 0) ELSE - Emit(opJLA, param1, param2); - Emit(opJGA, param1, cmd.param3) + Emit(opJLT, param2, 0); + Emit(opJGT, cmd.param3, 0) END |IL.opSBOOL: @@ -838,21 +843,31 @@ BEGIN |IL.opINCL, IL.opEXCL: BinOp(r2, r1); + Emit(opBIT, r2, r2); + r3 := GetAnyReg(); + ldr32(r3, r1); IF opcode = IL.opINCL THEN - Emit(opINCL, r1, r2) + Emit(opOR, r3, r2) ELSE - Emit(opEXCL, r1, r2) + Emit(opNOT, r2, 0); + Emit(opAND, r3, r2) END; + str32(r1, r3); + drop; drop; drop |IL.opINCLC, IL.opEXCLC: UnOp(r1); + r2 := GetAnyReg(); + ldr32(r2, r1); IF opcode = IL.opINCLC THEN - Emit(opINCLC, r1, param2) + Emit(opORC, r2, ORD({param2})) ELSE - Emit(opEXCLC, r1, param2) + Emit(opANDC, r2, ORD(-{param2})) END; + str32(r1, r2); + drop; drop |IL.opEQB, IL.opNEB: @@ -942,40 +957,51 @@ BEGIN Emit(opCMPC, r1, 0); Emit(opSNE, r1, 0) - |IL.opMIN: + |IL.opMIN, IL.opMAX: BinOp(r1, r2); - Emit(opMIN, r1, r2); + Emit(opCMP, r1, r2); + label := IL.NewLabel(); + IF opcode = IL.opMIN THEN + Emit(opJLE, label, 0) + ELSE + Emit(opJGE, label, 0) + END; + Emit(opMOV, r1, r2); + Emit(opLABEL, label, 0); drop - |IL.opMAX: - BinOp(r1, r2); - Emit(opMAX, r1, r2); - drop - - |IL.opMINC: + |IL.opMINC, IL.opMAXC: UnOp(r1); - Emit(opMINC, r1, param2) - - |IL.opMAXC: - UnOp(r1); - Emit(opMAXC, r1, param2) + Emit(opCMPC, r1, param2); + label := IL.NewLabel(); + IF opcode = IL.opMINC THEN + Emit(opJLE, label, 0) + ELSE + Emit(opJGE, label, 0) + END; + Emit(opMOVC, r1, param2); + Emit(opLABEL, label, 0) |IL.opIN: BinOp(r1, r2); - Emit(opIN, r1, r2); + Emit(opBIT, r1, r1); + Emit(opAND, r1, r2); + Emit(opCMPC, r1, 0); + Emit(opSNE, r1, 0); drop |IL.opINL: - r1 := GetAnyReg(); - movrc(r1, param2); - BinOp(r2, r1); - Emit(opIN, r1, r2); - mov(r2, r1); - drop + UnOp(r1); + Emit(opANDC, r1, ORD({param2})); + Emit(opCMPC, r1, 0); + Emit(opSNE, r1, 0) |IL.opINR: UnOp(r1); - Emit(opINC, r1, param2) + Emit(opBIT, r1, r1); + Emit(opANDC, r1, param2); + Emit(opCMPC, r1, 0); + Emit(opSNE, r1, 0) |IL.opERR: CallRTL(IL._error, 4) diff --git a/tools/RVM32I.ob07 b/tools/RVM32I.ob07 index d29d1f8..6ce1b02 100644 --- a/tools/RVM32I.ob07 +++ b/tools/RVM32I.ob07 @@ -22,22 +22,22 @@ IMPORT SYSTEM, File, Args, Out, API, HOST; CONST - opSTOP = 0; opRET = 1; opENTER = 2; opNEG = 3; opNOT = 4; opABS = 5; + opSTOP = 0; opRET = 1; opENTER = 2; opNEG = 3; opNOT = 4; opNOP = 5; opXCHG = 6; opLDB = 7; opLDH = 8; opLDW = 9; opPUSH = 10; opPUSHC = 11; - opPOP = 12; opLABEL = 13; opLEA = 14; opLLA = 15; opJNA = 16; opJGA = 17; - opJLA = 18; opJMP = 19; opCALL = 20; opCALLI = 21; + opPOP = 12; opLABEL = 13; opLEA = 14; opLLA = 15; (* 16, 17, 18 *) + opJMP = 19; opCALL = 20; opCALLI = 21; opMOV = 22; opMUL = 24; opADD = 26; opSUB = 28; opDIV = 30; opMOD = 32; - opSTB = 34; opSTH = 36; opSTW = 38; opINCL = 40; opEXCL = 42; - opIN = 44; opAND = 46; opOR = 48; opXOR = 50; opASR = 52; opLSR = 54; - opLSL = 56; opROR = 58; opMIN = 60; opMAX = 62; opCMP = 64; + opSTB = 34; opSTH = 36; opSTW = 38; (* 40, 42, 44 *) + opAND = 46; opOR = 48; opXOR = 50; opASR = 52; opLSR = 54; + opLSL = 56; opROR = 58; (* 60, 62 *) opCMP = 64; opMOVC = 23; opMULC = 25; opADDC = 27; opSUBC = 29; opDIVC = 31; opMODC = 33; - opSTBC = 35; opSTHC = 37; opSTWC = 39; opINCLC = 41; opEXCLC = 43; - opINC = 45; opANDC = 47; opORC = 49; opXORC = 51; opASRC = 53; opLSRC = 55; - opLSLC = 57; opRORC = 59; opMINC = 61; opMAXC = 63; opCMPC = 65; + opSTBC = 35; opSTHC = 37; opSTWC = 39; (* 41, 43, 45 *) + opANDC = 47; opORC = 49; opXORC = 51; opASRC = 53; opLSRC = 55; + opLSLC = 57; opRORC = 59; (* 61, 63 *) opCMPC = 65; - opSYSCALL = 67; opJBT = 68; opADDRC = 69; + opBIT = 66; opSYSCALL = 67; opJBT = 68; opADDRC = 69; opJEQ = 70; opJNE = 71; opJLT = 72; opJGE = 73; opJGT = 74; opJLE = 75; opSEQ = 76; opSNE = 77; opSLT = 78; opSGE = 79; opSGT = 80; opSLE = 81; @@ -163,7 +163,7 @@ BEGIN |opPOP: SYSTEM.GET32(R[SP], R[param1]); INC(R[SP], 4) |opNEG: R[param1] := -R[param1] |opNOT: R[param1] := ORD(-BITS(R[param1])) - |opABS: R[param1] := ABS(R[param1]) + |opNOP: |opXCHG: i := R[param1]; R[param1] := R[param2]; R[param2] := i |opLDB: i := param1 MOD 256; SYSTEM.GET8(R[param1 DIV 256] + param2, R[i]); R[i] := R[i] MOD 256 |opLDH: i := param1 MOD 256; SYSTEM.GET16(R[param1 DIV 256] + param2, R[i]); R[i] := R[i] MOD 65536 @@ -171,9 +171,6 @@ BEGIN |opPUSH: DEC(R[SP], 4); SYSTEM.PUT32(R[SP], R[param1]) |opPUSHC: DEC(R[SP], 4); SYSTEM.PUT32(R[SP], param1) |opLLA: SYSTEM.GET32(SYSTEM.ADR(Labels[param2]), R[param1]) - |opJGA: IF R[ACC] > param1 THEN cmd := Labels[param2] END - |opJLA: IF R[ACC] < param1 THEN cmd := Labels[param2] END - |opJNA: IF R[ACC] # param1 THEN cmd := Labels[param2] END |opJMP: cmd := Labels[param1] |opCALL: DEC(R[SP], 4); SYSTEM.PUT(R[SP], cmd); cmd := Labels[param1] |opCALLI: DEC(R[SP], 4); SYSTEM.PUT(R[SP], cmd); SYSTEM.GET(SYSTEM.ADR(R[param1]), cmd) @@ -195,12 +192,6 @@ BEGIN |opSTBC: SYSTEM.PUT8(R[param1], param2) |opSTHC: SYSTEM.PUT16(R[param1], param2) |opSTWC: SYSTEM.PUT32(R[param1], param2) - |opINCL: SYSTEM.GET32(R[param1], i); SYSTEM.PUT32(R[param1], ORD(BITS(i) + {R[param2]})) - |opINCLC: SYSTEM.GET32(R[param1], i); SYSTEM.PUT32(R[param1], ORD(BITS(i) + {param2})) - |opEXCL: SYSTEM.GET32(R[param1], i); SYSTEM.PUT32(R[param1], ORD(BITS(i) - {R[param2]})) - |opEXCLC: SYSTEM.GET32(R[param1], i); SYSTEM.PUT32(R[param1], ORD(BITS(i) - {param2})) - |opIN: R[param1] := ORD(R[param1] IN BITS(R[param2])) - |opINC: R[param1] := ORD(R[param1] IN BITS(param2)) |opAND: R[param1] := ORD(BITS(R[param1]) * BITS(R[param2])) |opANDC: R[param1] := ORD(BITS(R[param1]) * BITS(param2)) |opOR: R[param1] := ORD(BITS(R[param1]) + BITS(R[param2])) @@ -215,10 +206,6 @@ BEGIN |opLSLC: R[param1] := LSL(R[param1], param2) |opROR: R[param1] := ROR(R[param1], R[param2]) |opRORC: R[param1] := ROR(R[param1], param2) - |opMIN: R[param1] := MIN(R[param1], R[param2]) - |opMINC: R[param1] := MIN(R[param1], param2) - |opMAX: R[param1] := MAX(R[param1], R[param2]) - |opMAXC: R[param1] := MAX(R[param1], param2) |opLEA: R[param1 MOD 256] := Sections[param1 DIV 256] + param2 (*|opLABEL:*) |opSYSCALL: syscall(R[param1]) @@ -238,6 +225,7 @@ BEGIN |opSGT: R[param1] := ORD(~fl & ~fe) |opSGE: R[param1] := ORD(~fl) |opJBT: IF fb THEN cmd := Labels[param1] END + |opBIT: R[param1] := ORD({R[param2]}) END; cmd := cmd.next END @@ -379,7 +367,7 @@ BEGIN |opPOP: String("POP "); Reg(param1) |opNEG: String("NEG "); Reg(param1) |opNOT: String("NOT "); Reg(param1) - |opABS: String("ABS "); Reg(param1) + |opNOP: String("NOP") |opXCHG: String("XCHG "); Reg2(param1, param2) |opLDB: String("LDB "); Reg(param1 MOD 256); String(", ["); Reg(param1 DIV 256); String(" + "); Hex(param2); String("]") |opLDH: String("LDH "); Reg(param1 MOD 256); String(", ["); Reg(param1 DIV 256); String(" + "); Hex(param2); String("]") @@ -387,9 +375,6 @@ BEGIN |opPUSH: String("PUSH "); Reg(param1) |opPUSHC: String("PUSH "); Hex(param1) |opLLA: String("LLA "); RegL(param1, param2) - |opJGA: String("JGA "); Hex(param1); String(", L"); Hex(param2) - |opJLA: String("JLA "); Hex(param1); String(", L"); Hex(param2) - |opJNA: String("JNA "); Hex(param1); String(", L"); Hex(param2) |opJMP: String("JMP L"); Hex(param1) |opCALL: String("CALL L"); Hex(param1) |opCALLI: String("CALL "); Reg(param1) @@ -411,12 +396,6 @@ BEGIN |opSTBC: String("STB ["); Reg(param1); String("], "); Hex(param2) |opSTHC: String("STH ["); Reg(param1); String("], "); Hex(param2) |opSTWC: String("STW ["); Reg(param1); String("], "); Hex(param2) - |opINCL: String("INCL "); Reg2(param1, param2) - |opINCLC: String("INCL "); RegC(param1, param2) - |opEXCL: String("EXCL "); Reg2(param1, param2) - |opEXCLC: String("EXCL "); RegC(param1, param2) - |opIN: String("IN "); Reg2(param1, param2) - |opINC: String("IN "); RegC(param1, param2) |opAND: String("AND "); Reg2(param1, param2) |opANDC: String("AND "); RegC(param1, param2) |opOR: String("OR "); Reg2(param1, param2) @@ -431,10 +410,6 @@ BEGIN |opLSLC: String("LSL "); RegC(param1, param2) |opROR: String("ROR "); Reg2(param1, param2) |opRORC: String("ROR "); RegC(param1, param2) - |opMIN: String("MIN "); Reg2(param1, param2) - |opMINC: String("MIN "); RegC(param1, param2) - |opMAX: String("MAX "); Reg2(param1, param2) - |opMAXC: String("MAX "); RegC(param1, param2) |opLEA: String("LEA "); Reg(param1 MOD 256); String(", "); String(Names[param1 DIV 256]); String(" + "); Hex(param2) |opADDRC: String("ADD "); Reg(param1 MOD 256); String(", "); Reg(param1 DIV 256); String(", "); Hex(param2) |opLABEL: String("L"); Hex(param1); String(":") @@ -454,6 +429,7 @@ BEGIN |opSGT: String("SGT "); Reg(param1) |opSGE: String("SGE "); Reg(param1) |opJBT: String("JBT L"); Hex(param1) + |opBIT: String("BIT "); Reg2(param1, param2) END; Ln; cmd := cmd.next diff --git a/tools/RVM32I.txt b/tools/RVM32I.txt index b0a5492..c3f5a18 100644 --- a/tools/RVM32I.txt +++ b/tools/RVM32I.txt @@ -93,10 +93,10 @@ ENTER imm 2 imm 0 push BP; BP := SP; WHILE imm > 0 DO push 0; DEC(imm) END NEG Rn 3 n 0 Rn := -Rn NOT Rn 4 n 0 Rn := ORD(-BITS(Rn)) - ABS Rn 5 n 0 Rn := ABS(Rn) + NOP 5 0 0 нет операции XCHG Rn, Rm 6 n m temp := Rn; Rn := Rm; Rm := temp - LDB Rn, [Rm + imm] 7 m*256 + n imm Rn := BytePtr(Rm + imm)^ - LDH Rn, [Rm + imm] 8 m*256 + n imm Rn := Card16Ptr(Rm + imm)^ + LDB Rn, [Rm + imm] 7 m*256 + n imm Rn := UInt8Ptr(Rm + imm)^ + LDH Rn, [Rm + imm] 8 m*256 + n imm Rn := UInt16Ptr(Rm + imm)^ LDW Rn, [Rm + imm] 9 m*256 + n imm Rn := Int32Ptr(Rm + imm)^ PUSH Rn 10 n 0 DEC(SP, 4); Int32Ptr(SP)^ := Rn PUSH imm 11 imm 0 DEC(SP, 4); Int32Ptr(SP)^ := imm @@ -108,9 +108,7 @@ LEA Rn, HEAP + imm 14 n + 300H imm Rn := imm + address(HEAP) LEA Rn, STACK + imm 14 n + 400H imm Rn := imm + address(STACK) LLA Rn, L#hex 15 n hex Rn := address(L#hex) - JNA imm, L#hex 16 imm hex IF R0 # imm THEN goto L#hex - JGA imm, L#hex 17 imm hex IF R0 > imm THEN goto L#hex - JLA imm, L#hex 18 imm hex IF R0 < imm THEN goto L#hex + JMP L#hex 19 hex 0 goto L#hex CALL L#hex 20 hex 0 push PC; goto L#hex CALL Rn 21 n 0 push PC; goto Rn @@ -126,18 +124,13 @@ DIV Rn, imm 31 n imm Rn := Rn DIV imm MOD Rn, Rm 32 n m Rn := Rn MOD Rm MOD Rn, imm 33 n imm Rn := Rn MOD imm - STB [Rn + imm], Rm 34 n*256 + m imm BytePtr(Rn + imm)^ := Rm MOD 256 - STB [Rn], imm 35 n imm BytePtr(Rn)^ := imm MOD 256 - STH [Rn + imm], Rm 36 n*256 + m imm Card16Ptr(Rn + imm)^ := Rm MOD 65536 - STH [Rn], imm 37 n imm Card16Ptr(Rn)^ := imm MOD 65536 + STB [Rn + imm], Rm 34 n*256 + m imm UInt8Ptr(Rn + imm)^ := Rm MOD 256 + STB [Rn], imm 35 n imm UInt8Ptr(Rn)^ := imm MOD 256 + STH [Rn + imm], Rm 36 n*256 + m imm UInt16Ptr(Rn + imm)^ := Rm MOD 65536 + STH [Rn], imm 37 n imm UInt16Ptr(Rn)^ := imm MOD 65536 STW [Rn + imm], Rm 38 n*256 + m imm Int32Ptr(Rn + imm)^ := Rm STW [Rn], imm 39 n imm Int32Ptr(Rn)^ := imm - INCL Rn, Rm 40 n m Int32Ptr(Rn)^ := ORD(BITS(Int32Ptr(Rn)^) + {Rm}) - INCL Rn, imm 41 n imm Int32Ptr(Rn)^ := ORD(BITS(Int32Ptr(Rn)^) + {imm}) - EXCL Rn, Rm 42 n m Int32Ptr(Rn)^ := ORD(BITS(Int32Ptr(Rn)^) - {Rm}) - EXCL Rn, imm 43 n imm Int32Ptr(Rn)^ := ORD(BITS(Int32Ptr(Rn)^) - {imm}) - IN Rn, Rm 44 n m Rn := ORD(Rn IN Rm) - IN Rn, imm 45 n imm Rn := ORD(Rn IN imm) + AND Rn, Rm 46 n m Rn := ORD(BITS(Rn) * BITS(Rm)) AND Rn, imm 47 n imm Rn := ORD(BITS(Rn) * BITS(imm)) OR Rn, Rm 48 n m Rn := ORD(BITS(Rn) + BITS(Rm)) @@ -152,12 +145,10 @@ LSL Rn, imm 57 n imm Rn := LSL(Rn, imm) ROR Rn, Rm 58 n m Rn := ROR(Rn, Rm) ROR Rn, imm 59 n imm Rn := ROR(Rn, imm) - MIN Rn, Rm 60 n m IF Rm < Rn THEN Rn := Rm - MIN Rn, imm 61 n imm IF imm < Rn THEN Rn := imm - MAX Rn, Rm 62 n m IF Rm > Rn THEN Rn := Rm - MAX Rn, imm 63 n imm IF imm > Rn THEN Rn := imm + CMP Rn, Rm 64 n m сравнить Rn и Rm CMP Rn, imm 65 n imm сравнить Rn и imm + BIT Rn, Rm 66 n m Rn := ORD({Rm}) SYSCALL Rn 67 n 0 системный вызов; Rn содержит адрес параметров JBT L#hex 68 hex 0 перейти на метку L#hex, если "ниже" ADD Rn, Rm, imm 69 m*256 + n imm Rn := Rm + imm