Permalänk

Kan du assemblerprogrammering?

Försöker ta mig genom det här. Kör för att testa lite. Hur funkar det egentligen om man ska addera tal eller skriva en hälsning, den ser ut att loopa samma sekvens om och om igen, och under looparna tar med sig olika bokstäver/tecken och skriver ut?

Permalänk
Hedersmedlem

Hm, har du något exempel på vad du menar (kod, t ex)? Samt vad är det för arkitektur (jag gissar på x86)? Vilket OS du kodar under spelar ju viss roll också, samt vilken assembler du kör.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem

Har kodat lite asm i mina dagar, antar att du är du är intresserad av x86 assembler.
Addition sker genom add instruktionen, ADD eller ADC (Add with carry).

För att skriva ut en sträng så använder man på moderna OS inbyggda funktioner i OS:et, api-anrop. Förr (på gamla goa DOS tiden) så använde man antingen BIOS funktioner (interupts) eller skrev direkt till textminnet, detta är inte möjligt på moderna OS.

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk
Testpilot

Har programmerat assembler för en PIC18F452, hjälper det?

Visa signatur

Kolla gärna in min RGB-LED-ljusstake i galleriet
[Gigabyte GA-Z97MX-Gaming 5][Intel Core i5 4690K][Corsair XMS3 16GB][Asus GeForce RTX 2060 Super Dual Evo OC]

Permalänk

Har programmerat för PIC16F84 samt för Siemens(?) 80C535

Visa signatur

There is a Swedish conspiracy.
http://forum.theswedishconspiracy.com

Permalänk
Medlem

Assembler för 486 och ZiLog80, men du bör posta lite kod eller något

Visa signatur

tack o bock

Permalänk

Tack! Jag ska återkomma med mer konkret (ska hitta nåt exempel först), men låt mig först fråga. I vilken utsträckning använder man sig av Assembler nu för tiden, är det någon poäng att kunna det Idag och varför? I vilka sammanhang?? Om jag nu lär mig det bra, hur kommer jag kunna få användning av det på ett proffesionellt sätt?

Permalänk
Medlem

Används i första hand för inbyggda system, även om många nog gått över till C nu, fast även där är det mycket bra att kunna för att debugga saker som går fel.

Permalänk

I vilka fysiska former arbetar man i det som dagligt arbete då? Industrimaskiner, mobiltelefoner eller vad? Jag försöker få grepp om vilka konkreta produkter det används i (istället för java, c++ osv osv)...

Permalänk
Medlem

Inbyggda system = Typ allt ifrån bilar till microvågsugnar. Men mycket sånt har gått över till C som sagt, fast ASM är fortfarande rätt vanligt.

Wikipedia hade rätt bra info om current usage av ASM.
http://en.wikipedia.org/wiki/Assembly_language#Current_usage

Permalänk
Medlem

Assembler kanske inte används så där rakt av nu för tiden, men det är fortfarande mycket viktigt för debugging av program som kompilerar till maskinkod och för att se vilken typ av kod ens kompilator genererar för den kod man skrivit. Mycket viktigt när man kommer närmare hårdvaras om t.ex. i spekonsoller, drivrutiner etc.

Visa signatur

void@qnet
teeworlds, stålverk80, evil schemer, c, c++
Languages shape the way we think, or don't.

Permalänk

Har hackat lite assembler i några kurser, fast det var till typ "flex" processorn och nån annan som jag glömt namnet på.

Permalänk
Medlem

Texas Instruments TI83 räknare skriver man ASM till. Rätt kul att göra små spel eller så kan man använda den som en fjärrkontroll och bygga en IR sändare till den och styra med ASM. Finns massor med roligt.

Visa signatur

tack o bock

Permalänk

Jag vill inte trycka ut för mycket koder här, eftersom jag studerar samtidigt. Så det inte tror att jag fuskar bara för att jag försöker lära mig..

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av busta_rhyme
Jag vill inte trycka ut för mycket koder här, eftersom jag studerar introduktion till datavetenskap, på distans, första kursen på programmet. Liksom så de inte tycker jag fuskar, fast jag egentligen bara vill lära mig. Det roliga är att jag lär mig mer av folk här i forumet än genom skolan..

Vad är skillnaden mellan koden man skriver i Assembler editor mot Dissassembled Instructions? Det är väl samma kod i grunden, fast konverterade?

De största skillnaderna är nog:

* Inga kommentarer, variabelnamn, funktionsnamn, eller namngivna positioner (labels) i den disassemblade koden.
* Många assemblatorer tillåter komplexa structurer (structs) och makron, detta syns inte i den disassebemblade koden.

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk

Men det verkar vara svårt (iaf för nybörjare) att t ex multiplicera två tal (genom att addera dessa gång på gång), men att få simulatorn att skriva ut i decimaltal från att ha varit hexa!

Permalänk
Avstängd
Citat:

Ursprungligen inskrivet av busta_rhyme
Men det verkar vara svårt (iaf för nybörjare) att t ex multiplicera två tal (genom att addera dessa gång på gång), men att få simulatorn att skriva ut i decimaltal från att ha varit hexa!

Det är viktigt att du förstår hur processorn jobbar innan man börjar testa lite assembler. Förstår man hur processorn jobbar blir det lättare. Assembler i sig är egentligen busenkelt om man förstår processorn. Det är så enkelt att det blir svårt och göra komplicerade saker.

Visa signatur

Programmerare med C++ som huvudspråk.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av busta_rhyme
Men det verkar vara svårt (iaf för nybörjare) att t ex multiplicera två tal (genom att addera dessa gång på gång), men att få simulatorn att skriva ut i decimaltal från att ha varit hexa!

Vad för assembler är det du använder? Det flesta processorer har multiplikation inbyggt, så det är inget man själv måste koda. Att "addera dessa gång på gång" är en värdelös multiplikationsalgorithm, men en sån implementation skulle kunna se ut som den nedan.

x86 multiplikation genom att "loopa gång på gång." Obs. funkar inte om tal2 (räknaren är noll).

xor eax, eax // nollställ resultatet mov ebx, tal1 // spara undan tal1 mov ecx, tal2 // antal gånger l1: add eax, ebx // addera på talet dec ecx // minska räknaren jz end // hoppa till slutet om räknaren är noll jmp l1 // loopa end: // klart

Reserverar mig för fel, var ett bra tag sen jag kodade asm.

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk
Citat:

Ursprungligen inskrivet av gosh
Det är viktigt att du förstår hur processorn jobbar innan man börjar testa lite assembler. Förstår man hur processorn jobbar blir det lättare. Assembler i sig är egentligen busenkelt om man förstår processorn. Det är så enkelt att det blir svårt och göra komplicerade saker.

gosh.. Boken jag läser är knappast pedagogisk, hur är det det bästa sättet ATT lära sig hur processorn fungerar då. Om jag börjar där..

Permalänk

Inom inbyggda system lever assembler kvar som inline assembler, man använder alltså assembler inne i den vanliga koden. (t.ex C)
På detta sätt kan man göra effektivare kod och i vissa fall tydligare. Det uppstår dock ibland problem som flyktiga variabler, vilket innebär att man kanske måste deklarera variabeln som volatile och då har man istället en "slöare kod".
Inline assembler förekom även på x86or, vanligt var att man sparkade igång muspekaren genom biosen från dos.
Men det börjar försvinna från 86or idag, då man eftersträvar enkelt och tydlig kod.
Det är ingen som vill ha en kod man för varje rad sitter och beundrar hur jävla duktig programmeraren måste ha varit, utan att man istället tycker att varje kodrad är enkel och effektiv.

Nå inom debuggning lever assembler kvar och kommer göra det i väldigt många år till.
Många studenter läser dessutom någon "assemblerkurs" i ettan för att förstå grunderna inom mjukvaruprogrammering. (Det finns hårdvarubeskrivande språk för dem som tycker assembler är för newbies, vilket dock inte används för x86or)

Visa signatur

[Core i7-3930K med 32GB ram, 2*256GB SSD] & [Core i7 3770K med 16 GB RAM, 256GB SSD] som tillsammans har ett [HD 5850 1GB] och 3st 24".

Permalänk

Asseembleeer

Kolla den här bilden, det är två saker jag undrar över. Vad fyller parentesen till höger för funktion (vad betyder $10=16) osv! Dessutom, det står siffror i minnescellerna. Vad innebär det egentligen när det står 00: 21,10 innan själva instruktionen. Försöker få grepp om grunden..

http://www.highlifemusic.se/datakunskap_programmering/SimpsSi...

Fast nu hann jag ikapp mig själv kanske, eftersom ingen annan hann svara. Men tolkar jag rätt om i detta fall (2= op code, 1 = register, 10 Value).. Alltså.. 21,10 BETYDER att värde 10 skall vara i register 1?

Permalänk
Medlem

$ betyder att talet är hexadecimalt, 10 hexadecimalt är 16 decimalt.

opcoden 21 betyder helt enkelt "ladda R1 med ett värde". Den kommer att ladda R1 med den efterföljande byten, $10 i detta fall.
Samma sak med 20 (ladda R0) och 22 (ladda R2).

"Men tolkar jag rätt om i detta fall (2= op code, 1 = register, 10 Value)."
Troligen, verkar ju vara ett designat låtsas assemblerspråk, så då kanske det räcker med 16 instruktioner. Med tanke på att det finns 16 register så verkar den andra nibblen representera registret.

"Inline assembler förekom även på x86or, vanligt var att man sparkade igång muspekaren genom biosen från dos."

Inline assembler förekommer ganska mycket fortfarande, speciellt när man vill använda sig av dataparallism (SIMD).

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk

Om det ska vara så skrämmande lätt, så borde logiken gå att förklara här och nu väldigt enkelt eller?? När man skriver kod, behöver man ta hänsyn till nån speciell ordning som vissa sammanhang skall komma i? Load, NextChar, Ready, Text osv...

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av busta_rhyme
Om det ska vara så skrämmande lätt, så borde logiken gå att förklara här och nu väldigt enkelt eller?? När man skriver kod, behöver man ta hänsyn till nån speciell ordning som vissa sammanhang skall komma i? Load, NextChar, Ready, Text osv...

Vad menar du egentligen?
"ta hänsyn till nån speciell ordning som vissa sammanhang skall komma i"
Menar du själva programflödet eller vadå? Programflödet styr man ju med hopp.

Vad är "Load, NextChar, Ready, Text" som du pratar om? Genom lite snabbt googlande så antar jag att du refererar till denna bild:
http://wwwes.cs.utwente.nl/software/simpsim/images/asmwin.gif
Men varför inte skriva det i tråden då? Så slipper vi gissa vad du pratar om?

Vad Load, NextChar, Ready och Text gör bör ju vara ganska enkelt att förstå om man kan lite engelska. (Läsa kommentarerna kanske?)

Har du sysslat med någon programmering innan? Känns som att det skulle vara bättre om du började med ett normalt språk istället.

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk

Alltså jag pluggar ett program, inte jag som bestämmer ordningen på kurserna. Första kursen är datavetenskap. Och NEJ jag har inte programmerat något innan. Det är därför man går i en skola, för att lära sig saker man inte kan något om..
Ja det var exakt den situationen som bilden, helt exakt. Men jag HADE inte den bilden att referera till faktiskt. Stört att du hittade den som var precis som det jag snackade om.. Och JA det var programflödet jag tänkte på..
Men har jag missförstått nåt om det verkar som att man laddar in alla bokstäver osv i register, som finns i Text, för att sedan loopa en uppgift som plockar ur en bokstav i taget tills alla är hämtade och därefter stannar?

Därför undrade jag, om Text ligger sist i flödet, varför kommer bokstäverna fram först när man kör RUN..

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av busta_rhyme
Alltså jag pluggar ett program, inte jag som bestämmer ordningen på kurserna. Första kursen är datavetenskap. Och NEJ jag har inte programmerat något innan. Det är därför man går i en skola, för att lära sig saker man inte kan något om..
Ja det var exakt den situationen som bilden, helt exakt. Men jag HADE inte den bilden att referera till faktiskt. Stört att du hittade den som var precis som det jag snackade om.. Och JA det var programflödet jag tänkte på..
Men har jag missförstått nåt om det verkar som att man laddar in alla bokstäver osv i register, som finns i Text, för att sedan loopa en uppgift som plockar ur en bokstav i taget tills alla är hämtade och därefter stannar?

Ska försöka klara exakt vad den gör:

load R1, Text // ladda in addressen till texten till R1
load R2, 1 // ladda in 1 till R2
load R0, 0 // ladda in värdet 0 till R0, värdet 0 används för att terminera strängar,observera att detta är en byte med värdet 0 och inte själva tecknet 0.

NextChar: load RF, [R1] // hämta värdet som R1 pekar på, dvs indirekt addressering och skriv det till RF, som verkar vara ett minnesmappad register. Det som skrivs till RF är det som skrivs ut på skärmen.
addi R1, R1, R2 // R1 = R1 + 1, dvs peka på nästa bokstav i texten
jmpEQ RF=R0, Ready // hoppa till Ready om sista utskrivna tecket är nulltermineraren.
jmp NextChar // Loopa

Ready: halt // stoppar processorn

"Därför undrade jag, om Text ligger sist i flödet, varför kommer bokstäverna fram först när man kör RUN.."

Du tänker på fel sätt nu, Text är ju för det första inga instruktioner, utan ren binärdata som man tolkar som text. Själva assemblatorn kommer att fixa till så att det ligger åtkompligt i minnet.
Ordningen i koden spelar ingen större roll. Den kommer alltid börja högst uppe och följa alla hopp.

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk

Om jag ska göra en enkel multiplikation, t ex få fram resultatet 6. Då bör jag alltså addera 2+2+2 och sedan visa upp resultatet som blir 6??

load R0, 0
load R1, 2
load R2, 2
load R3, 2
addi R3, R2, R1
jmpEQ nånting nånting osv..

Eller är jag helt ute och cyklar?

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av busta_rhyme
Om jag ska göra en enkel multiplikation, t ex få fram resultatet 6. Då bör jag alltså addera 2+2+2 och sedan visa upp resultatet som blir 6??

load R0, 0
load R1, 2
load R2, 2
load R3, 2
addi R3, R2, R1
jmpEQ nånting nånting osv..

Eller är jag helt ute och cyklar?

Nej.
Finns multiplikationsalgorithmer man bör implementera.

"addi R3, R2, R1" är inte ett av dessa vart resultatet ska sparas?
Och varför sparar du 2:an på tre ställen? räcker väl att spara den i R0 och göra typ:

R0 + R0 -> R1
R1 + R0 -> R1

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk

Ah ok..

R0 + R0 -> R1
R1 + R0 -> R1

Är -> ett giltigt kommando och hur får man ut svaret på det där?

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av busta_rhyme
Ah ok..

R0 + R0 -> R1
R1 + R0 -> R1

Är -> ett giltigt kommando och hur får man ut svaret på det där?

... Säger ordet pseudo-kod dig något?
med -> menade jag självklart "lagra resultatet"

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410