![Post Post](./styles/serenity/imageset/icon_topic_latest.gif)
Re: Mixing 32 bit calculation in 16 bit program NASM
Back to original topic. I got the kernel loaded (back to basics). But i have a little calculation concept confusion.
lets say
LBAStart = 63
DataAreaStart = 411
ClusterNo = 15142
BytesPerSector = 64
So LBA = 63 + 411 + (15142-2) * 64 = 969434
I was doing was this (assume AX holds ClusterNo and ClusterLBA dw 0, 0):
Code:
MOV AX, [ES:DI+15]
SUB AX, 2
XOR DX, DX
MOV BX, [SectorsPerCluster]
MUL BX
MOV [ClusterLBA], AX
MOV [ClusterLBA + 2], DX
ADD EAX, [LBAStart]
MOV EAX, [ClusterLBA]
;;;;;;; upto this part i was right
ADD EAX, [DataAreaStart]
now after adding DataAreaStart which is WORD in size i got
10011011100101011011010 = 5098202 incorrect !!
I even tried this :
Code:
ADD EAX, DWORD [DataAreaStart]
All the same.
Then i thought back in pure 8086 DX:AX used to represent a DWORD
Then did this:
Code:
MOV AX, [ES:DI+15]
SUB AX, 2
MOV BL, [SectorsPerCluster]
MUL BX
MOV [ClusterLBA], AX
MOV [ClusterLBA + 2], DX
MOV EAX, [LBAStart]
ADD EAX, DWORD [ClusterLBA]
ADD EAX, [DataAreaStart]
MOV [ClusterLBA], AX
MOV [ClusterLBA + 2], DX
MOV EAX, DWORD[ClusterLBA]
MOV [DAP + 8], EAX
It was correct. Now whats the catch here ?? why didn't EAX got the right value instead of DX:AX. I mean the operation ADD EAX, WORD[DataAreaStart] was directly on EAX. It should have got the expanded dword value.
Anybody with hints ??
Regards.