problem med simulering av assembler

Permalänk
Medlem

problem med simulering av assembler

Har en uppgift där jag ska skriva program som läser indata från minnet, utför additionerna/subtraktionerna nedan och spara resultatet i minnet:

a) 8+5
b) 24-12

Fråga a) blir rätt. Man ska ju omvandla decimaltalen till hex talen. visst räknar man b) som 24 + ( -12)

decimaltalet 24 blir ju 18 och 12 blir C i hex. Det blir väl då -C. När man skriver in 18 och -C i assembler så blir det 36. Den räknar bara 18 +C (24+12)

själva programmet ser ut så här: 1010
1111
5210
3212
C000

Permalänk
Medlem

Precis som du säger så räknar man 24 + ( -12 ), första tanken där är väl att du måste omvandla 12 till ett negativt tal genom tvåkomplement.
Sen undrar jag vad det är för assembly du skriver? Vilken arkitektur?

Permalänk
Medlem

blir 12 med tvåkomplementmetoden 1101

Permalänk
Hedersmedlem
Skrivet av strom63:

blir 12 med tvåkomplementmetoden 1101

Nej. Den gamla tumregeln är väl att invertera alla bitar av |x| och sedan addera 1 (för att erhålla en tvåkomplementsrepresentation av -|x| alltså; 12 är 1100 (eller snarare 01100) som vanligt).

Permalänk
Medlem

Men 12 är ju 1100 i binärform.

för att invertera så blir det ju 0011 och sedan skulle man ju lägga till ett. Blir inte det 1011

Permalänk
Hedersmedlem
Skrivet av strom63:

Men 12 är ju 1100 i binärform.

för att invertera så blir det ju 0011 och sedan skulle man ju lägga till ett. Blir inte det 1011

0011 + 1 = 0100
Man måste dessutom utöka till (minst) fem tecken för att få rum med all information.
12: 01100
-12: 10100

Permalänk
Medlem

hur kan 0011 +1 bli 0100 blir det inte 0111.

Permalänk
Hedersmedlem
Skrivet av strom63:

hur kan 0011 +1 bli 0100 blir det inte 0111.

Skriver du med minst signifikant bit till höger? Det är ungefär som när 099 + 1 = 100.

Permalänk
Medlem

Tror det blir 0100, ser man det inte som typ en "varvräknare"

Visa signatur

ʕ•͡ᴥ•ʔ

Permalänk
Medlem

om man ska ändra det till hex vad blir det sen då

Permalänk
Medlem
Skrivet av strom63:

om man ska ändra det till hex vad blir det sen då

4. Eller 14, om du ska ha de fem bitar Elgot pratar om.

Permalänk
Medlem

Hur många bitar är det på talen du skriver in? Vid tvåkomplement ger den mest signifikanta biten information om talet är positivt eller negativt. Det innebär att du på 4 bitar kan representera tal mellan -8 och 7, skriver du talet i 5 bitar är största tal 15 och minsta -16.
När det gäller lagring av tal är oftast en byte den minsta lagringen man har, den är 8 bitar vilket innebär att exempelvis 10 representerat med en byte blir 00001010, invertera detta får du 11110101 och addera sedan med 1 (00000001) så får du 11110110 som är representationen av -10 i tvåkomplement.
För att omvandla detta till hex är det enklast att dela upp talet i stycken om 4 bitar och sedan ange hex representation av vardera. Det vill säga 11110110 -> 1111 0110 där 1111 -> F, 0110 -> 6, altså är -10 i tvåkomplement och hexform F6.

Sen undrar jag fortfarande vilken typ av assembly det gäller, i t. ex. MIPS finns det metoder som sub för subtraktion för alla tal och subu för att utföra subtraktion på två positiva tal.

Permalänk
Medlem

deciamaltalet 30 är 11110 i binärform. För att få fram -30 så måste man väl göra om det i 8 bitars och blir det då: 0001 1110. för att sedan invertera det och addera 1 så blir det väl 1110 0010. Har jag gjort rätt?

Permalänk
Hedersmedlem
Skrivet av strom63:

Har jag gjort rätt?

Ja.

Permalänk
Medlem

för att göra om 1110 0010 till hex så blir det E2

-125 blir 1000 0011 i binärform efter invertering och addering av 1. Sen omvandling till hex blir 83

Men för att räkna ut -125 + (-30)

så skriver man alltså in 83 och E2.

Men när man avslutar programmet i assembler så blir det 65. Men 65 i decimaltal är ju 101.

Då måste jag ju har gjort något fel. För det ska ju bli 155.

Permalänk
Hedersmedlem
Skrivet av strom63:

Men för att räkna ut -125 + (-30)

så skriver man alltså in 83 och E2.

Men när man avslutar programmet i assembler så blir det 65. Men 65 i decimaltal är ju 101.

Då måste jag ju har gjort något fel. För det ska ju bli 155.

Nu blir talen för stora igen; åtta bitar täcker bara -128 till 127. Utöka.

Permalänk
Medlem

ska man ta då 9 bitar alltså lägga till en 0

Permalänk
Medlem
Skrivet av strom63:

ska man ta då 9 bitar alltså lägga till en 0

Kan man ju göra. Oftast går man väl direkt till 16 bitar, även om det finns tolv- (PDP-8) och niobitarsCPUer (Multics).

Permalänk
Medlem

125=1111101

Med 9 bitar blir det väl 001111101

001111101=invertering+1= 110000011

Har jag gjort rätt?

Permalänk
Hedersmedlem
Permalänk
Medlem

Då blir -125= 183 som hex

-30 var E2 som hex

när jag skriver in 183 och E2

ddå blir det 65 i hex när jag avslutar programmet

65 i hex är ju 101 i decimal. Det stämmer ju inte.

Permalänk
Hedersmedlem

Såhärj blir det väl ungefär när du adderar de två talen:

-30: 111100010 -125: 110000011 + 1101100101 1101100101 = 1111 0110 0101 = f65

Det ser ut som att du saknar bitar igen.

Permalänk
Medlem

Vad menar du? Hur ska det vara för att det ska bli rätt?

Permalänk
Medlem

Du måste jobba med ett större bitantal för att det skall fungera, i detta fallet skulle 9 bitar vara tillräckligt då det kan representera tal mellan -256 till 255, däremot är 9 bitar ingen vanlig standard för talrepresentation, nästa steg är oftast 16.
dvs -30 = 1111 1111 1110 0010 = ffe2 och -125 = 1111 1111 1000 0011 = ff83.
För att få ut intervallet av tal som kan representeras med x antal bitar kan man allmänt säga att de sträcker sig från -(2^(x-1)) till 2^(x-1) - 1 där x är antal bitar.

Permalänk
Hedersmedlem
Skrivet av strom63:

Vad menar du? Hur ska det vara för att det ska bli rätt?

Man måste tänka på att negativa tal har ettor istället för nollor till vänster om de bitar som representerar talet samt ta hänsyn till eventuellt spill när man adderar.

e2 + 83 ------ 165

och inte bara 65. Just den där representationen är dock rätt kass då det inte framgår att man har nio bitar och inte 12 (som man förväntar sig av tre hexadecimala tecken). Man skulle kunna lägga till tre ettor (som för negativa tal fungerar som nollor) framför och erhålla f65, men bäst är nog att redan från början utöka representationen till minst tolv bitar:

(f)fe2 + (f)f83 ---------- 1(f)f65

Permalänk
Medlem

men hextalet ff65 blir ju inte 155 i decimal

Permalänk
Medlem

Det är väl rätt program:

1010
1111
5210
3212
c000

Permalänk
Medlem

Det ryms max 8 bitar alltså en byte i varje minnescell i den assembler som jag jobbar i. så jag kan inte använda 12 eller 16 bitar.

Permalänk
Hedersmedlem
Skrivet av strom63:

men hextalet ff65 blir ju inte 155 i decimal

Nej, men -155. Du får invertera bitarna och addera 1 för att konvertera från tvåkomplementsformen.

Permalänk
Medlem

Men det rymms bara två tecken i den assembler som jobbar i så det funkar inte. Så jag får skriva det i min uppgift