Assembly osztás, szorzás. Miért vonunk ki mindig 0-t?
2018-12-08T18:14:49+01:00
2018-12-09T17:35:47+01:00
2022-08-11T08:45:32+02:00
Midorian
xor ax,ax xor bx,bx ;ax-et, bx-et nullázzuk mov di, offset muvelet1 ;di-be mozgatjuk a muvelet1 offset címét mov al, [di] ;al-be mozgatjuk a cím által mutatott értéket (a string első karakterét) sub al,'0' add di,2 ;átlépjük az első karaktert és a szorzás jelét, hogy a második számhoz jussunk mov bl,[di] ;bl-be beolvassuk a második számot, a string 3. karakterét sub bl,'0' div bl ;elosztjuk bl-t al(ax)-el. mov cx,ax ;cx-be elmentjük az eredményt (eredmény+maradék) mov dl,al ;az eredményt dl-be rakjuk add dl,'0' ;dl-hez hozzáadunk 0-t mert ha az eredmény 0 akkor is 0-t szeretnénk kiírni mov ah,2 int 21h mov dl,',' int 21h mov dl,ch add dl,'0' int 21h
Adott ez a program. A muvelet 1 amúgy a következő: "muvelet1    db    "8/5""



Miért vonunk ki/adunk hozzá mindig 0-t az eredményhez?
Mutasd a teljes hozzászólást!
Írod, hogy

A muvelet 1 amúgy a következő: "muvelet1   db   "8/5""

Ha felcsapod a már említett ASCII táblát, ez úgy néz ki a memóriában, hogy

56, 47, 53
merthogy ezek rendre a '8', a '/' és a '5' karakter kódjai. Szóval ha csak ezeket betöltenéd a regiszterekbe, a 47 kihagyásával, akkor 56-ot osztanál el 53-mal, ami nem pont az a számítás, amit elvégezni szeretnél.
Viszont ha ezekből elvonod a '0' karakter kódját, 48-at, akkor hirtelen (56-48)=8-at osztasz (53-48)=5-tel, ami már jobban emlékeztet arra, amit csinálni szeretnél.
Mutasd a teljes hozzászólást!

Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
Címkék
abcd