Avatar billede danm Nybegynder
18. december 2007 - 14:06 Der er 6 kommentarer og
2 løsninger

Assembler og specifik CPU kodning

Jeg er begyndt at kigge på assembler programmering fordi det virker noget spændende at lære. Formålet var lidt med tiden at kunne lave nogle små programmer der fylder lidt og kører hurtigt, plus det er jo også lidt interresant at vide hvad der egentlig sker bag alt High-level koden...

Men jeg er lidt nysgerrig efter hvordan forskellige programmer kodes til forskellige CPU'er (altså sådan at de kan køre på flere forskellige CPU'er). De fleste siger at man derfor er bedre stillet med at kode i C da det ikke er CPU specifikt, men C koden bliver jo også til compilet til maskinkode, så den bliver vel nærmest ikke CPU specifik?
Egentlig er det vel kun intel og AMD procesorer, men er der stor forskel på disse's maskin kode? Og er der stor forskel på at kode i 32 bit og 64 bit? Alle sider der fortæller om assembler sproget nævner kun 32 bit. Men er det fordi at 32 bit programmer kan køre på 64 bit CPU'er uden problemer eller sån noget?
Avatar billede pidgeot Nybegynder
18. december 2007 - 14:27 #1
Forskellen på at programmere direkte i assembler ift. eks. C, er at for C er der en compiler der tager dine kommandoer og oversætter til assembler baseret på den computertype den skal køre på. Den binary du får ud af det vil være bundett il en specifik arkitektur, men du kan kompilere den samme kode på en anden arkitektur for at få et program der kan køre der. Det samme er ikke tilfældet for at programmere direkte i assembler, hvor du låser dig fast i en specifik arkitektur.

Intel og AMD er for alle praktiske formåls skyld identiske, og alle x64-processorer er bagudkompatible med x86, så der er ingen problemer der. Det samme gælder dog ikke hvis vi eks. sammenligner en PowerPC-processor med en Intel, og det er her problemet opstår - din assemblerkode kan ikke kompileres på en PowerPC hvis den er skrevet til en Intel, men det kan din C-kode godt.
Avatar billede japping Nybegynder
18. december 2007 - 14:35 #2
Ja, c-kode bliver kompileret til maskinkode.

Mht. Intel og AMD er jeg ikke klar over hvad det er du egentlig vil programmere. Hvis det er mindre microprocessorer som www.microchip.com's PIC-processorer eller www.atmel.com's avr-processor, så kan du downloade gratis software og købe hardware for under kr. 500,-, hvorefter du er godt i gang. Men det kræver en del tid inden du får noget op og køre. Når du først er i gang koster hver chip fra omkring kr. 10,-.

Alternativt kan du arbejde med systemer fra www.rabbitsemiconductor.com eller www.digi.com, men disse programmeres i C da det er store mængder kode der skal til for at drive systemerne. Disse systmer koster  fra omkring kr. 1.000,- og op til omkring kr. 3.000,-. Når du først er i gang koster hvert modul omkring kr. 600,-.

Men det kommer altså helt an på hvad det er du ønsker at lave.
Avatar billede danm Nybegynder
18. december 2007 - 16:01 #3
ok, jeg troede nemlig lige at det var selve assembler compileren der lavede maskin koden til henholdsvis den ene eller den anden CPU. Men er selve Assembly kommandoerne dermed forskellige for hver arkitektur? Og hvad med x86 og x64, er kommandoerne også forskellige der?
Det jeg egentlig vil kode er "kun" windows og Linux programmer. Ikke store GUI applikationer, men mere småting. Mest for at se hvor langt jeg kan komme med at lære det og forhåbentlig blive lidt dygtig til det.
Der hvor jeg lige er mest forvirret er det her med Intel og AMD. Når jeg kører eller installerer et program i windows synes jeg jo ikke jeg lægger mærke til noget der tjekker for en bestemt CPU type, så programmerne virker til at være ens til begge CPU'er.
Nu ved jeg ikke lige hvad en PowerPC er, men det er nok ikke noget jeg lige skal arbejde med.
Avatar billede pidgeot Nybegynder
18. december 2007 - 17:21 #4
PowerPC er den arkitektur man brugte på Macs før de gik over til Intel, og ja den har et helt andet instruktionssæt end x86/x64.

Intel og AMD benytter sig af samme arkitektur - som sagt er de for alle praktiske formål identiske.

x64 er et superset af x86 - dvs. x64 indeholder x86. Dvs. du kun skal bekymre dig om hvorvidt du bruger x64-kommandoer.

Når det gælder udvikling er det meget, meget sjældent nyttigt at skrive alt i assembler. Man vil typisk kun gøre det for få udvalgte rutiner hvor det er en nødvendighed at der er optimeret så meget som overhovedet muligt, da det er besværligt at arbejde med lange assembler-procedurer.
Det skader desuden portabiliteten - alt afhængigt af hvad du laver, kan du ikke nødvendigvis kompilere et rent Win32-assemblerprogram på Linux og få det til at give samme resultat, selv hvis du får abstraheret fra diverse headers, og det går da først galt hvis du skifter arkitektur.

Alt det abstraherer et high-level sprog som C eller for den sags skyld Pascal fra, så du ikke skal bekymre dig om hvordan operativsystemet håndterer alt muligt - det har compileren og/eller dine grundlibraries styr på.
Avatar billede arne_v Ekspert
19. december 2007 - 03:00 #5
Dette bliver vist mest en gentagelse, men anyway.

Der findes forskellige processor arkitekturer:
  x86 alias IA-32
  x86-64 alias x64 alias en hel masse (som er et superset af x86)
  PowerPC (udover i non-Intel Macs også brugt i IBM's store maskiner)
  SPARC (brugt af SUN)
  Itanium alias IA-64 (brugt i HP's store maskiner)

Et af de væsentlige kende tegn ved en processor arkitektur er dens instruktions set
(instruktionerne og deres operander).

Rigtig maskine kode er binært og vises normalt som hex kode.

Assembler kode er en tekst med et 1:1 forhold til den binære maskin kode.

ADDL r0,r1 i assembler bliver f.eks. til 0x07 0x00 0x01 i maskin kode.

Assembler er derfor meget afhængigt af processor arkitekturen.

Fordi assemblere er lidt forskellige så er der i virkelighedens verden også
forskel på assembler til forskelligt assembler software til samme arkitektur.
Fordi det er samme instruktions sæt, så er forskellen lille men den er der.

Den ene vælger måske at bruge:

.dword 123

mend den anden bruger

.lword 123

for at have en 4 byte integer konstant.

C kode vil næsten være den samme for forskellige processor arkitekturer. Forskellen
er at nogen gange er en int 16 bit andre 32 bit andre 64 bit.

Det anses idag generelt som værende uøkonomisk at skrive assembler kode til normale
applikationer. Der er naturligvis visse få undtagelser.

Jeg vil stadig mene at det er nyttigt at prøve et kod ei assembler, fordi det giver
en langt bedre forståelse for programmering også i høj niveau sprog.

Bemærk at moderne CPU'er og compilere er så avancerede at det ofte er svært at
optimere i forhold til det C compileren genererer.

Men du kan altid snyde lidt. Bed din C compiler liste den assembler kode den har
genereret og studer den !
Avatar billede danm Nybegynder
05. januar 2008 - 15:06 #6
Takker for hjælpen. Jeg har fundet em assembler IDE kaldet winASM studio som jeg vil igang med at lege lidt med.
En skam at det er så "forældet" det her sprog. Det er svært at finde meget nyt dokumentation til at lære selve sproget.

Smid endelig svar begge to.
Avatar billede pidgeot Nybegynder
05. januar 2008 - 15:57 #7
Svar :)
Avatar billede arne_v Ekspert
05. januar 2008 - 19:21 #8
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester