[Assembly] Geeft rare waarde terug, begrijp er helemaal niet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dag mensen,

Voor mijn studie moet ik een programma schrijven in assembly die macht kan verheffen.

Nu heb ik het volgens mij af alleen het afdrukken gaat niet goed en daar snap ik dus helemaal niets van. Misschien dat er hier iemand is die me een klein beetje op weg kan helpen met deze wazige bende.

Hier is mijn code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
    ;start op geheugenadres:
    org 50000
    ;grondgetal
    ld b,4
    ;macht
    ld c,3
    ;vasthouden van uitkomst
    ld d,11
    jp main

vermenigvuldig:
    ;laad uitkomst in rekenregister a
    ld a, d
    ;laad uitkomst in aftelregister c
    ld c, d
    ;tel uitkomst op bij a
    add a,d
    ;haal een van het aftelregister af
    dec c
    ;zet a weg in b
    ld b,a
    ;laad c in a om te vergelijken
    ld a, c
    ;vergelijk
    cp 0
    ;als het niet 0 is herhaal
    jp nz, vermenigvuldig
    ;zet uitkomst weer in d
    ld d, b
    ;anders terug naar main
    ret

main:
    ;vermenigvuldig
    ;call vermenigvuldig
    ;verlaag macht
    dec c
    ;laad c in a om te vergelijken
    ld a, c
    ;vergelijk
    cp 0
    ;niet nul? terug naar boven
    jp nz, main
    ;anders printen
    ld a, 0
    ld b, 0
    ld c, 0
    ld d, 0
    ld l, 0
    call print_unsigned8
include "print_unsigned8.asm"


Merk op dat ik de functie vermenigvuldig even voor het gemak totaal over sla om het printen te testen.

Wat gebeurt er onderaan nou? Nou:
laad 0 in het l register.
en dan print_unsigned aanroepen

Dan geeft hij dus 00 weer.
Als ik bijvoorbeeld 1 laad, dan geeft hij 11
en 123 geeft hij 1233
Bij helemaal niets geeft hij 433 terug :')

Ik word hier helemaal gek van en snap niet wat er nou mis gaat dus misschien dat iemand me een paar kleine hints kan geven.

Bedankt

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 08:58

Creepy

Tactical Espionage Splatterer

Kan het niet zijn dat de fout in print_unsigned8.asm zit? Dus heb je die code al gedebugged? Weet je precies wat die print_unsiged 8 doet? Wat heeft die aan input nodig?

Je laat nogal wat relevante code en informatie achterwege, en geeft wat onnodige code die je op dit moment niet eens gebruikt.

[ Voor 53% gewijzigd door Creepy op 18-03-2010 13:32 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Creepy schreef op donderdag 18 maart 2010 @ 13:31:
Kan het niet zijn dat de fout in print_unsigned8.asm zit? Dus heb je die code al gedebugged? Weet je precies wat die print_unsiged 8 doet? Wat heeft die aan input nodig?

Je laat nogal wat relevante code en informatie achterwege, en geeft wat onnodige code die je op dit moment niet eens gebruikt.
Die print_unsigned8 hebben we aangeleverd gekregen. Maar ik denk dat er daar wat mis mee is want de testbestanden die bij die functie zitten werken ook niet.

Kan het zijn dat dit gebeurt omdat ik een 64bits windows draai met ZXSpin emulator en deze alleen onder 32 bits werkt? Of zou dat niets uit hoeven maken...?

Acties:
  • 0 Henk 'm!

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 18-08 21:31
Heb je ook een debugger? Stap er dan eens stap voor stap door heen, dan zul je al snel een aantal fouten tegenkomen. Als je geen debugger hebt schrijf dan op wat de waarden zijn van elk register na elke stap, het programma is klein genoeg om dat nog met de hand te doen.

Acties:
  • 0 Henk 'm!

Verwijderd

z80 assembly? :P daar heb ik mijn hele havo aan verspild...

kan je niet beter gestructureerd testen met welke input hij wat uitput? desnoods plak je tussen elke regel een print.
mach verheffen met een 8 bit getal is n.l. niet echt moeilijk (voor mij, annyway..) ik kan wel wat in elkaar knutselen als je wil ;)

het is, vooral in assembly, een schone zaak zoveel mogelijk CALL's te gebruiken bij routines, anders snap je er al snel geen reet meer van. en ik kan het weten...
heb al 6k regels code op een project zitten

edit: speciaal voor jou: een efficiente (O(n) waar n = aantal bits) multiplicatie routine
code:
1
2
3
4
5
6
7
8
9
10
mul:    ;vermenigvuldig A met C, resultaat in A
        LD  D,A ;D = 1a
        xor     a   ;a = 0
        LD  B,8 ;aantal bits
start:  rr  c   
        jr  nc,end
        add a,D ;a += D << b-8
end:    SLA D   ;d *= 2
        djnz    start
        ret

[ Voor 127% gewijzigd door Verwijderd op 20-03-2010 23:36 ]


Acties:
  • 0 Henk 'm!

  • abeker
  • Registratie: Mei 2002
  • Laatst online: 05-05 11:32

abeker

...

Het is simpel: na het aanroepen van de functie print_unsigned8 stopt het programma niet, maar gaat het verder met de code die je include op regel 51, waardoor print_unsigned8 effectief 2x uitgevoerd wordt.

the less one forgets, the less one remembers


Acties:
  • 0 Henk 'm!

Verwijderd

abeker schreef op zondag 21 maart 2010 @ 10:41:
Het is simpel: na het aanroepen van de functie print_unsigned8 stopt het programma niet, maar gaat het verder met de code die je include op regel 51, waardoor print_unsigned8 effectief 2x uitgevoerd wordt.
dat zag ik 5 min geleden ook, idd :P
Pagina: 1