车讯:售价7.99-10.99万元 上汽通用科沃兹成都
Den h?r artikeln beh?ver k?llh?nvisningar f?r att kunna verifieras. (2018-12) ?tg?rda genom att l?gga till p?litliga k?llor (g?rna som fotnoter). Uppgifter utan k?llh?nvisning kan ifr?gas?ttas och tas bort utan att det beh?ver diskuteras p? diskussionssidan. |

Assembler eller assemblyspr?k ?r ett s?tt att uttrycka maskinkoden f?r en dators processor p? ett s?tt som l?mpar sig f?r m?nniskor att l?sa och skriva. Programmet som ?vers?tter assembler till numerisk maskinkod kallas en assemblator.
I maskinkod representeras s?v?l instruktioner som adresser och ?vriga konstanta data som m?nster av siffror (bitar eller i annan talbas), utan vare sig semantiskt eller strukturellt st?d f?r minnet. Det ?r bland annat d?rf?r besv?rligt att skriva, redigera och fels?ka. Assembler m?jligg?r d?rf?r anv?ndandet av namngivna data samt att den aktuella maskinens instruktioner skrivs med bokst?ver, s? kallade mnemotekniska symboler. Detta underl?ttar h?gst v?sentligt f?r programmeraren, inte minst f?r att adresser ofta ?r relativa (varandra) och d?rf?r m?ste ber?knas p? nytt vid varje program?ndring; med en assemblator ber?knas symboliska namn snabbt och automatisk, inklusive alla relativa adresser och index f?r ing?ende rutiner och datastrukturer.
Assemblatorer har ofta vanliga infixa operatorer f?r evaluering av (relativa) konstanta uttryck i olika talbaser, inklusive operationer p? bitniv?, utf?rda av assemblatorn (ej processorn man skriver f?r). M?nga m?jligg?r ocks? anv?ndandet av makron, n?got som syntaktisk liknar en funktion i ett ordin?rt h?gniv?spr?k men inneb?r att ett stycke parametriserad assemblerkod (modifierad av aktuell parameter) infogas p? varje plats den refereras.
Assembler ?r allts? ett samlingsnamn f?r en m?ngd maskinspecifika spr?k. Olika processorfamiljer erbjuder olika instruktioner, och olika assemblatorer erbjuder olika syntax f?r till exempel adressering och makron. Detta g?r att det i allm?nhet inte g?r att anv?nda ett assemblerprogram skrivet f?r en processor p? en annan typ av processor. F?r att g?ra det m?jligt att flytta program mellan olika processortyper anv?nds h?gniv?spr?k.
?vers?ttning till maskinkod – och tv?rt om
[redigera | redigera wikitext]Det program som ?vers?tter assemblerkod till maskinkod kallas assemblator och sj?lva ?vers?ttningsprocessen f?r assemblering. I denna process f?rsvinner all information om vad instruktioner, data och funktioner kallats i programmet, till st?d f?r l?sbarheten. De ers?tts med dels numeriska maskininstruktioner, dels konstanta adresser f?r platser i minnet d?r data och instruktioner lagras, samt konstanta data.
Maskinkoden kan via ett disassemblerande program, en disassemblator, ?ter?vers?ttas till assemblerkod. L?sbarheten f?r ett disassemblerat program blir dock mycket s?mre ?n f?r assemblerkod, d? alla hopp- och minnesadresser endast kan ?vers?ttas till ett l?pnummer, eftersom ursprungskoden inte finns tillg?nglig. Det medf?r att om man vill veta programmets funktion m?ste man f?lja koden instruktion f?r instruktion. F?r att underl?tta, kan en avlusare i st?llet anv?ndas. Dessa har normalt en disassemblator inbyggd samt en trace-funktion som utf?r en instruktion i taget och mellan dessa visar inneh?llet i register, stack och arbetsareor. Sedan inv?ntas anv?ndarens respons innan n?sta instruktion utf?rs. Typiska responser ?r "n?sta instruktion", "hoppa till annat st?lle", "s?tt in 'x' i register/minnesarea", "avbryt", "k?r till n?sta brytpunkt" samt "k?r till slutet".
Exempel
[redigera | redigera wikitext]N?gra exempel p? assemblerkod f?r olika processortyper.
IBM OS/360 assembler (och senare)
[redigera | redigera wikitext]Exempel p? assemblerkod fr?n IBM:s stordatorer (eng: mainframe). Den ursprungliga OS/360-assemblern kom till kring 1960 p? IBM:s laboratorium p? Liding?, och torde ha st?tt modell f?r de flesta av alla f?rekommande assemblerspr?k d?refter.
Inom IBM-v?rlden kallas spr?ket f?r ASM (eller BAL Basic Assembly Language; det ?r ofta en generationsfr?ga). ASM torde vara det vanligaste, kompletterad med beteckning f?r version, milj? mm, t ex S/390 ASM, ASM-H eller High Level Assembler (HLASM).
Fr?n b?rjan skrevs alltid typ "OS/360", d?r OS st?r f?r Operating System, f?r att skilja fr?n "DOS/360" (Disk Operating System) som innebar att milj?n var minidator inte stordator. N?r minidatorerna fasade ut, b?rjade beteckningar typ "S/390" bli allm?nna.
Egentligen ?r det s? att n?r man pratar om h?rdvaran, s?ger man till exempel "S/370"; och pratar man om motsvarande operativsystem, s?ger man "OS/370".
AMODE ANY Accept both 24 and 31 bit addresses
RMODE 24 May also be called by 24 bit address programs
IEFBR14 CSECT , Control section start, module name and entry point
USING IEFBR14,15 Establish addressability; reg 15 contains address of entry point
B SAVE+72 Skip over PgmId & SaveArea
DC AL1(L'PGMID) Length of name
PGMID DC C'IEFBR14' The name itself
SAVE DC 18F'0' Own save area; contains registers of calling program
STM 14,12,12(13) Save regs of calling program
ST 13,SAVE+4 Caller's save area addr
LR 14,13 Retain caller's save area addr
LA 13,SAVE Local save area addr
USING SAVE,13 Switch addressability so we may use reg 15
ST 13,8(14) Report own save area addr to calling pgm
* In case you actually want something done, put it here
L 13,SAVE+4 Restore save area reg of calling pgm from own save area
LM 14,12,12(13) Restore regs of calling pgm
SR 15,15 Zero register 15 = return code "ok" ==> RC or CC
* If something went wrong, put another return code in register 15
BR 14 Return addr in R14 -- go back to calling pgm
END IEFBR14 End assembly and specify default entry point for Linkage Editor / Loader
- Det lilla programmet ovan heter IEFBR14 som IBMs klassiska dummy-program (den utf?r allts? "ingenting"), men ?r skriven fritt efter hur det troligen ser ut i senaste 31-bitsadress-version, och kan d?rf?r knappast bryta IBMs eventuella copyright. Det ?r allts? inte kopierat fr?n n?got st?lle.
I den allra f?rsta versionen inneh?ll programmet endast raden " BR 14 " (hoppa tillbaka till anropande program), d?rav namnet, men flera ?ndringar kr?vdes f?r att den skulle anpassas till IBM:s konventioner f?r hur program ska se ut f?r att fungera i alla sammanhang och med nyare versioner av h?rd- och mjukvara.
Det kan tyckas att detta ?r r?tt mycket kod f?r att faktiskt inte utf?ra n?gonting, men mainframe-v?rlden ?r mer komplex ?n den ?r i andra milj?er. R?tt tidigt utvecklades conditional assembly ("villkorlig assembler"), vanligen kallad macroassembler ?ven i andra milj?er. Med detta kunde snarlika grupper av ?terkommande programrader ges ett namn och med vissa anropsparametrar kan ovanst?ende kod i ett typiskt program t.ex. reduceras till:
AMODE ANY Accept both 24 and 31 bit addresses
RMODE 24 May also be called by 24 bit address programs
IEFBR14 SAVE
...
RETURN RC=8 ..(at any point of error condition)
...
RETURN
END IEFBR14 End of assembly
H?r m?ste makrona SAVE och RETURN vara utf?rligt f?rdefinierade antingen i ett s?rskilt bibliotek eller lokalt i programkoden. IBM har f?rdefinierat flera hundra standardmacron; varje enskilt f?retag kan ha minst lika m?nga egna och vissa program har sin grupp som d? ?r s?rskilt programtypiska.
x86/MS-DOS assembler
[redigera | redigera wikitext]F?ljande kod kan k?ras p? ett x86/MS-DOS-system och skriver ut texten "Hello, World!" p? sk?rmen samt avslutar programmet. Programmet anv?nder sig av instruktionen "int" f?r att anropa operativsystemet f?r att skriva ut texten p? sk?rmen. Programmet utnyttjar m?jligheten att anv?nda symboliska namn; namnet "hello" ?r ett symboliskt namn f?r den minnesadress texten "Hello, World!" befinner sig p?.
mov ah,9
mov dx,offset hello
int 21h
mov ah,4Ch
int 21h
hello db 'Hello, World!',0dh,0ah,'$'
MIPS-assembler
[redigera | redigera wikitext]F?ljande ?r ett utdrag ur programkoden f?r en enkel processhanterare f?r multitasking p? en MIPS-processor. Koden i exemplet ?r del av den kod som sparar undan register, pekare och stack (sw-instruktionerna) f?r den aktiva processen och byter till en annan (lw-instruktionerna).
lbu t5 0(t2)
nop
addiu t5 t5 1
nop
sb t5 0(t2)
sw t2 4(s1) ; store gp
sw t3 8(s1) ; store sp
sw t4 0(s1) ; write back pcb1
sw s2 0(s0) ; change curpcb <= pcb2
lw k1 0(s2) ; change CP+4
lw gp 4(s2) ; change gp <= glob2
lw sp 8(s2) ; change sp
nop
b restore
nop
Motorola M68k
[redigera | redigera wikitext] Adress: MOVE.L A0, $FF8240
ADDI.B #$D0, D1
LEA ($0400,A0), A0
ROL.W (A0)
CMP.W D1, (A0)
BNE.S Adress