Les 6: Instructies en nog meer instructies.... In de vorige lessen hebben we de syntax van de assembler bekeken en een voorbeeld gegeven van een echt werkend assemblerprogramma. Vandaag zullen we eens bekijken welke instructies nou in de praktijk het meest voorkomen in programma's voor de ST. Hiervoor heb ik twee programma's eens nader onder de loep genomen, een snelle editor, waarvan wordt beweerd dat hij in assembler is geschreven, en een C-compiler, die naar ik aanneem in C is geschreven. Van deze twee programma's heb ik een groot deel gedisassembleerd. ( Een dis-assembler is een programma dat van een programma een assembler- listing kan produceren. Heel handig als je in de keuken van andere programmeurs wilt kijken. Toch minder dan je misschien zou denken, want je mist natuurlijk wel de dingen die programma's zoveel begrijpelijker maken, zoals het commentaar van de programmeur. Ook de namen van de variabelen en subroutines worden omgezet in saaie nummertjes, dus om de werking van een op die manier verkregen listing in assembler te doorgronden is een kwestie van geduld en taai volhouden... ) Deze disassembly heb ik gecontroleerd op datagebieden en die eruit gegooid voor zover ik ze kon identificeren. Data die toevallig overeenkomen met een geldige machinecodeinstructie kunnen niet altijd door de disassembler worden ontmaskerd, als in een programma bijvoorbeeld het getal $4E75 voorkomt kan de disassembler niet weten of er RTS wordt bedoeld, of gewoon $4E75. Gelukkig is dat voor een mens met zijn grotere overzicht meestal geen groot probleem. Toen heb ik 8000 instructies uit ieder programma genomen en heb daarin de frequentie van alle instructies geteld. Merk op wat ik voor mijn oplettende lezertjes overheb. Gelukkig helpt een goede search-and-replace optie die alle vervangingen voor je telt, maar een paar uur ben ik er toch wel mee bezig geweest. De resultaten van dit belangwekkende experiment staan hieronder. Lees het eens door, je hoeft niet de namen van de instructies meteen te onthouden maar het is toch goed om ze alvast eens te hebben gezien, dan blijven ze wellicht wat makkelijker plakken als we ze vanaf de volgende les gaan behandelen. Ik heb geprobeerd instructies die op de een of andere manier "bij elkaar horen" ook gezamenlijk te nemen. Andere indelingen zijn natuurlijk ook mogelijk. Verder heb ik in commentaar de betekenis van de opcode-afkorting vermeld. In het Engels heten deze afkortingen de "assembler mnemonics". (spreek uit "nemmonniks") Tabel I: ------------------------------------------------------------------------ Instructie-frequenties in 8000 instructies van een in assembler geschreven programma en in 8000 instructies in een C-programma. .ASM .C move 1517 3107 ; MOVE moveq 613 2 ; MOVE Quick movem 278 75 ; MOVE to Memory movea 97 250 ; MOVE to Address register movep 19 0 ; MOVE to Peripheral device clr 98 166 ; CLeaR totaal 2622 = 32.8 % 3600 = 45.0 % jsr 19 461 ; Jump to SubRoutine bsr 974 0 ; Branch to SubRoutine rts 286 134 ; ReTurn from Subroutine totaal 1261 = 15.8 % 595 = 7.4 % beq 288 218 ; Branch if EQual bne 237 247 ; Branch if Not Equal bmi 98 0 ; Branch if MInus bhi 77 2 ; Branch if HIgher bls 66 0 ; Branch if Lower or Same bcs 64 1 ; Branch if Carry Set bcc 55 15 ; Branch if Carry Clear bpl 43 2 ; Branch if PLus bgt 30 24 ; Branch if Greater Than blt 0 57 ; Branch if Less Than ble 19 40 ; Branch if Less than or Equal bvs 3 0 ; Branch if oVerflow Set bvc 0 0 ; Branch if oVerflow Clear bge 2 33 ; Branch if Greater than or Equal totaal 982 = 12.3 % 693 = 8.0 % cmp 360 174 ; CoMPare tst 155 36 ; TeST btst 58 3 ; BitTeST cmpi 51 284 ; CoMPare Immediate cmpm 17 0 ; CoMPare Memory cmpa 12 2 ; CoMPare Adress register tas 8 0 ; Test And Set totaal 661 = 8.3 % 499 = 6.2 % lea 548 309 ; Load Effective Address pea 23 125 ; Push Effective Address totaal 571 = 7.1 % 434 = 5.4 % adda 121 207 ; ADD to Address register addq 184 414 ; ADD Quick add 151 69 ; ADD addi 5 0 ; ADD Immediate addx 0 18 ; ADD eXtended totaal 461 = 5.8 % 708 = 8.9 % subq 186 65 ; SUBtract Quick sub 172 53 ; als bij add etc. suba 10 0 ; subi 2 1 ; subx 0 6 ; totaal 370 = 4.6 % 125 = 1.6 % jmp 27 128 ; JuMP to another address bra 257 385 ; BRAnch to another address totaal 284 = 3.6 % 513 = 6.4 % roxr 1 14 ; ROtate with eXtend to the Right roxl 1 10 ; Left rol 6 0 ; Rotate to the Left ror 14 0 ; Right asr 7 16 ; Arithmetical Shift to the Right asl 4 101 ; Left lsr 64 25 ; Logical Shift to the Right lsl 54 0 ; Left totaal 151 = 1.9 % 166 = 2.1 % dbeq 18 0 ; Decrement datareg and Branch if EQual dbf 110 8 ; Decrement datareg and Branch if False dbne 10 0 ; Decrement datareg and Branch if Not Equal (Van dit type zijn er nog 12) totaal 138 = 1.7 % 8 = 0.1 % or 15 23 ; OR eor 11 6 ; Exclusive OR not 18 6 ; NOT neg 15 17 ; NEGate and 28 96 ; AND ori 15 19 ; OR Immediate andi 26 5 ; AND Immediate totaal 128 = 1.6 % 172 = 2.2 % trap 34 3 ; TRAP ext 13 209 ; EXTend nop 1 0 ; No OPeration swap 31 4 ; SWAP exg 10 7 ; EXchanGe totaal 89 = 1.1 % 223 = 2.8 % mulu 53 8 ; MULtiply Unsigned muls 1 20 ; MULtiply Signed divu 10 2 ; DIVide Unsigned divs 0 3 ; DIVide Signed totaal 64 = 0.8 % 33 = 0.4 % bclr 26 0 ; Bit Clear bset 30 10 ; Bit SET bchg 4 0 ; Bit CHanGe totaal 60 = 0.8 % 10 = 0.1 % smi 2 0 ; Set if Minus seq 2 8 ; Set if EQual spl 1 0 ; Zie verder bij BPL etc sne 3 1 ; shi 2 0 ; st 14 0 ; Set True slt 0 1 ; totaal 24 = 0.3 % 10 = 0.1 % link 0 131 ; LINK unlk 0 127 ; UNLinK totaal 0 = 0.0 % 258 = 3.2 % -------------------------------------------------------------------------- Merk op dat we nu nog niet ALLE instructies gehad hebben die de 68000 processor in z'n mars heeft, maar voorlopig kunnen we nu wel even voort dunkt me. Wat betreft de verschillen tussen de programma's blijkt dat de editor inderdaad van 75 instructies van de 68000 gebruik maakt, en de compiler maar van 61. Dit maakt de claim dat het programma in assembler is geschreven inderdaad zeer waarschijnlijk, hoewel het vooral het ontbreken van de instructies LINK en UNLK in de editor is dat vrijwel bewijzend is. In de komende lessen wil ik een aantal van de meest voorkomende instructies eens zeer uitvoerig onder de loep nemen. Met behulp van de principes die we uit die instructies kunnen afleiden wordt dan het begrijpen van de rest steeds eenvoudiger. Geloof me, het zware werk is nu eigenlijk achter de rug voor wie de informatie uit de afgelopen vijf lessen goed hebben geabsorbeerd.