jAsm

Diskussioner om programmering

Moderatorer: Fanta_gbg, e5frog, stonan, Zlasher, hollowman

Re: jAsm

Inläggav carlsson » 28 september 2016, 23:38

Blir inte relativt hopp rätt knöligt att självmodifiera, då man behöver ta 16-bitarsadressen dit man vill hoppa, subtrahera från adressen där instruktionen ligger och komma fram till om det ska vara -128 eller +127? Eller missförstod jag hur det används?
Användarvisningsbild
carlsson
VIC-20 Guru
VIC-20 Guru
 
Inlägg: 2313
Blev medlem: 10 oktober 2007, 16:24
Ort: Västerås

jAsm

Inläggav bjonte » 29 september 2016, 06:23

Det är inte så knöligt om man bara hoppar framåt. Jag brukar göra detta i switch-satser när det lämpar sig med en hopptabell istället för en massa if-satser.

Kod: Markera allt
enum command
{
  play,
  stop,
  pause,
}

// -> A: command [0..63]
subroutine execute_command
{
  asl // four bytes per entry in jump table
  asl
  sta .branch_offset
  bcc .branch_offset: *
  jmp play
  nop // align entries to four bytes
  jmp stop
  nop
  jmp pause
  nop
  // ...
}

...

lda #command.play
jsr execute_command

...
Användarvisningsbild
bjonte
Stormästare
Stormästare
 
Inlägg: 1690
Blev medlem: 17 april 2006, 23:12

Re: jAsm

Inläggav bjonte » 30 september 2016, 15:49

Jag ska nu börja jobba med att få in typerna list och map i språket. Jag måste bestämma mig för vad const ska betyda för en samling av värden. Är det tillåtet att modifiera en lista som ligger i en const-lista? Om man tilldelar en variabel en lista som ligger i en const-lista, ska den då få modifieras? Ska det vara tillåtet att tilldela en const-lista till en variabel överhuvudtaget?
Användarvisningsbild
bjonte
Stormästare
Stormästare
 
Inlägg: 1690
Blev medlem: 17 april 2006, 23:12

Re: jAsm

Inläggav Redreamer » 30 september 2016, 16:55

Är inte hela grejen med konstanter att de är konstanter. Inte att man får ändra i dem. Även om jag nog ser att man kan vilja det.
It always return one day!
Användarvisningsbild
Redreamer
Stormästare
Stormästare
 
Inlägg: 1260
Blev medlem: 1 maj 2005, 10:07
Ort: Borås

Re: jAsm

Inläggav bjonte » 30 september 2016, 17:32

Jo, så är det, men definitionen av konstant varierar. Kickassembler till exempel menar att konstant betyder att symbolen inte kan byta värde men innehållet kan det! Där går det alltså att lägga till ett värde i en konstant lista! Där finns ett nyckelord för att låsa en lista till att inte kunna modifieras istället.

Det blir klurigare när det finns referenser till värden, som i Java till exempel. Om jag har en variabel som pekar på ett objekt och så tilldelar jag en annan variabel samma värde så pekar de på samma objekt. Om den ena referensen är konstant och den andra inte går det att ändra på det konstanta objektet via den icke-konstanta referensen.

I C++ kan både värdet och referensen var oberoende konstant eller inte. Så långt vill jag inte gå för det blir för komplicerat.

I jAsm sker tilldelningar "by value" för enkla typer, som byte, word, long och bool, men "by reference" för dynamiska typer som sträng, lista och map (som i Java). Jag tänker mig att värden och referenser kan vara konstanta eller inte och att en const-symbol bara kan innehålla konstanta värden och referenser. En variabel kan bara innehålla icke-konstanta värden och referenser. Ickekonstanter kan implicit konverteras till konstanter men inte tvärt om. Det måste finnas en kloningsfunktion som används när man behöver skapa en icke-konstant av konstanta värden eller referenser.
Användarvisningsbild
bjonte
Stormästare
Stormästare
 
Inlägg: 1690
Blev medlem: 17 april 2006, 23:12

Re: jAsm

Inläggav bjonte » 2 oktober 2016, 06:59

Jag hade funderat en hel del på det här nu och jag tror att jag kommer att lösa detta så att const betyder att allt innehåll och allt som refereras är konstant och kan inte ändras på något sätt, inte via andra variabler eller på annat sätt. Problemet som måste lösas är vad som ska hända om man försöker tilldela en const-symbol en referens till något som inte är const eller tvärt om.

Kod: Markera allt
const a = [1, 2, 3] // en lista
var b = a
b[1] = 4


Antingen så tillåts det inte eller så görs en djup-kopia av det som ska tilldelas. Jag tror att jag kommer att gå på kopia-spåret eftersom det annars lätt uppstår förvirring om vad som går och inte går.

Det här tillåter att flera const-symboler pekar på samma const-lista utan att göra djupa kopior. Flera icke-const-symboler kan peka på samma icke-const-lista också, med det kan ifrågasättas eftersom det kan få oönskade effekter.

Det här gör automatiskt att alla variabler som skickas som argument till makron kommer att djupkopieras för alla argument blir nämligen konstanter. Jag tänker mig att lösingen på detta är att införa nyckelordet "var" i argumentlistan. Ifall det står före ett argument så betyder det att det är en variabel och inte en konstant. Det signalerar också till användaren att värdet är tänkt att ändras av makrot.

Kod: Markera allt
macro ändra(var .lista)
{
  lista[0] = 1
}

var a = [2,2,3]
ändra(a)
print(a) // [1,2,3]
Användarvisningsbild
bjonte
Stormästare
Stormästare
 
Inlägg: 1690
Blev medlem: 17 april 2006, 23:12

Re: jAsm

Inläggav bjonte » 2 oktober 2016, 07:18

Hmm. Jag velar lite om det ska genereras ett fel om man försöker konvertera const till icke-const.

Kod: Markera allt
macro ändra(var .lista)
{
  .lista[0] = 1
}

const a = [2,2,3]
ändra(a)
print(a) // [2,2,3]


Här är det ju uppenbart att programmeraren hade tänkt ändra på variabeln, men om djupkopian görs tyst så kommer detta inte att upptäckas. I det här fallet skulle ett felmeddelande kunna genereras istället som säger att det inte går att konvertera const till var och att en explicit clone-funktion måste anropas på argumentet till ändra().
Användarvisningsbild
bjonte
Stormästare
Stormästare
 
Inlägg: 1690
Blev medlem: 17 april 2006, 23:12

Re: jAsm

Inläggav bjonte » 23 oktober 2016, 08:02

Jag fick ett tips på jobbet om att göra samma sak som Python gör. Alla tilldelningar görs med pekare och så tillämpas copy-on-write så att bara kopior görs på saker som ändras. Jag ska satsa på det eftersom det både är effektivt och enkelt för den som använder det.
Användarvisningsbild
bjonte
Stormästare
Stormästare
 
Inlägg: 1690
Blev medlem: 17 april 2006, 23:12

Re: jAsm

Inläggav bjonte » 23 oktober 2016, 08:05

Under HöST(h)ack i Floby så har jag slutfört support för Z80 i assemblern. Jag ska klistra ihop en release så snart jag har kommit hem.
Användarvisningsbild
bjonte
Stormästare
Stormästare
 
Inlägg: 1690
Blev medlem: 17 april 2006, 23:12

Re: jAsm

Inläggav bjonte » 23 oktober 2016, 14:33

Att lösa hur man ska skapa en lista syntaktiskt var inte trivialt. Jag har spenderat en del tid med att fundera på olika alternativ. Jag skulle ha velat använda hakparenteser för listor och krullparenteser för mappar.

Kod: Markera allt
const a = [1, 2, 3]
const b = {a=1, b=2}


Problemet med detta är att jag har slösat upp krullparenteserna till andra konstruktioner, framför allt define. Det är krångligt att veta under parsningen om en krullparentes ska vara en map eller en mängd av definierad data. Det är också problematiskt att jag inte kräver att argument till section är inom parenteser. Om man skulle lägga på ett komma för mycket skulle man få skumma felmeddelanden om att en map inte var syntaktiskt korrekt, eller ännu värre, att det assemblerade men blev något helt annat. Därför är jag nu inne på att de konstrueras med nyckelorden list och map.

Kod: Markera allt
const a = list(1, 2, 3)
const b = map(a=1, b=2)
Användarvisningsbild
bjonte
Stormästare
Stormästare
 
Inlägg: 1690
Blev medlem: 17 april 2006, 23:12

Re: jAsm

Inläggav TBC » 23 oktober 2016, 23:54

Tack för nya z80-binären! Var det meningen att python-scriptet skulle ligga med i binär-arkivet?
Användarvisningsbild
TBC
Erfaren mästare
Erfaren mästare
 
Inlägg: 306
Blev medlem: 4 september 2008, 16:44

Re: jAsm

Inläggav bjonte » 24 oktober 2016, 11:06

Nej, det var inte meningen. Jag är en klant helt enkelt. Vad var det för skript?
Användarvisningsbild
bjonte
Stormästare
Stormästare
 
Inlägg: 1690
Blev medlem: 17 april 2006, 23:12

Re: jAsm

Inläggav TBC » 24 oktober 2016, 11:47

Det låg inget script där, men jag undrar var du har scriptet för att omvandla stora bokstäver?
Användarvisningsbild
TBC
Erfaren mästare
Erfaren mästare
 
Inlägg: 306
Blev medlem: 4 september 2008, 16:44

Re: jAsm

Inläggav TBC » 24 oktober 2016, 11:56

En liten grej: i dokumentationen står det: "variables must be used after they are declared."
Jag antar att du menar "variables must be declared before they are used".
Man MÅSTE väl inte använda dem? :)
Användarvisningsbild
TBC
Erfaren mästare
Erfaren mästare
 
Inlägg: 306
Blev medlem: 4 september 2008, 16:44

Re: jAsm

Inläggav bjonte » 24 oktober 2016, 17:25

Haha, bra hittat! Man måste inte använda dem.
Användarvisningsbild
bjonte
Stormästare
Stormästare
 
Inlägg: 1690
Blev medlem: 17 april 2006, 23:12

FöregåendeNästa

Återgå till Programmering/prog.-verktyg

Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 1 gäst

Banners

BOA Japon Mediapalatset Nostalgibutiken
Quartex Retro Overlays Retroplay Spel och sånt
Super Motaro Söders Serie & Skivhandel vintagegames.se RG 2016
cron