Toon posts:

[ASM] Getal weergeven?*

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik ben bezig aan een stukje code ( ben begonnen in assembler programmeren ) maar ik zit met een probleempje.

De situatie : Je heb een willekeurige reeks getallen, en daaruit moet je het grootste en 2de grootste halen, en in de eerste vier byte-locaties van het DATASEG stoppen nl op grg en twgrg.

nu heb ik dit als code gemaakt :

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
 IDEAL
 DOSSEG
 MODEL small
 STACK 256

max_int equ 7fffh

DATASEG
  grg DW ?
  twgr DW ?

brongeg DW 20,10235,23,1950
        DW 17600,6000,61005,45
        DW 845,0,max_int


 CODESEG
begin:
 mov ax,@DATA
 mov ax,ds          

 mov [BYTE grg],0       
 mov [BYTE twgr],0
 mov bx,OFFSET brongeg      
        

wlus:
 mov al,[BYTE grg]
 mov cl,[BYTE twgr]      
 cmp [WORD bx],al   ( word, omdat getallen groot kunnen zijn )  
 jz vlus            
 mov cl,al          
 mov al,bx          
                
vlus:                 
 inc bx             
 inc bx                             
 cmp [WORD bx],max_int          
 jz cont            
 jmp  wlus          
    
cont:
???

uitgang:
 mov ah,04Ch
 int 21h
 END begin


nu zou ik dus m'n cl & al terug moeten in m'n dataseg van grg & twgrg krijgen ..
dit zou moeten gebeuren in cont .. maar daar zit ik vast ? :o

ps : ik ben nog maar een beginner O-)

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Je loopt volgens mij behoorlijk te goochelen met data- en registergroottes. :P
Laat ik voorop stellen dat je in dit voorbeeld voor alle adressen/registers waar je data-getallen en grootste getallen in wilt opslaan, words moet gebruiken, geen bytes.

Echter, op verschillende plaatsen in je code gebruik je een cast naar een byte. Zo assembled het wel zonder foutmeldingen, maar krijg je een ongewenst effect.
Voorbeeld:
code:
1
 mov [BYTE grg], 0

Je "grg" is 16 bits groot, maar je vertelt de assembler hier dat hij "grg" als een byte (van 8 bits) moet behandelen. Gevolg is dat alleen de laagste byte van "grg" op 0 komt te staan, en er niks met de hoogste byte gebeurt. Als daar nu nog rommel in zit, betekent dit voor het getal "grg" dat het ook na de "mov [BYTE grg],0" nog niet op 0 staat, en dat kan niet de bedoeling zijn. Dit werkt beter (pas dit ook aan in de rest van je code, zodat je nergens met bytes werkt):

code:
1
mov grg, 0


Dan, de registers. Je weet hopelijk dat AX een register is ter grootte van 16 bits, en dat deze onder te verdelen is in AH (hoogste 8 bits), en AL (laagste 8 bits). Met andere woorden, als AX = 1234h, dan is AH = 12h en AL = 34h. Wat je doet op regel 33 kan dus niet: je vraagt de cpu om een 16-bits register in een 8-bits register te stoppen.

Oh, en als je vergelijkt op grootte (zoals op regel 31), gebruik dan de mnemonics die ervoor bedoeld zijn, dat maakt je programma makkelijker leesbaar, voor jezelf en voor anderen. Dus als je wilt weten of [BX] groter is dan AL, doe dan de conditionele jump "jg" (van Jump if Greater).

En als laatste, hoe ben je van plan de 2 grootste getallen te vinden, want dat is me ook niet helemaal duidelijk? Je loopt door de lijst getallen "brongeg" heen en als het getal wat aangewezen wordt door BX groter is dan je huidige grootste getal in AL, dan wordt CL gelijk aan AL zodat het je nieuwe een-na-grootste getal is, en dan vul je vervolgens AL met het grootste getal.
Deze aanpak klopt niet helemaal, want wat gebeurt er als je de getallenlijst "200, 18, 34, 3" afwerkt?

Ik zou de volgende aanpak willen voorstellen (in pseudo-code)
code:
1
2
3
4
5
6
7
8
9
10
11
12
eerste = 0
tweede = 0
zolang er nog getallen zijn doe
  g = volgende getal
  als g > tweede
    als g > eerste
      //g is het grootste getal, dus het huidige grootste getal wordt nu 2-na-grootste
      tweede = eerste
      eerste = g
    anders
      //g is groter dan tweede, maar kleiner dan eerste: g is het 2-na-grootste getal
      tweede = g


Kijk maar eens hoe ver je hier mee komt. En als je er niet uitkomt, gewoon melden he :)

[ Voor 18% gewijzigd door MrBucket op 24-05-2005 21:50 ]


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 06-05 12:34

mulder

ik spuug op het trottoir

smart ass


;)

[ Voor 100% gewijzigd door whoami op 25-05-2005 12:43 ]

oogjes open, snaveltjes dicht