My Questions About Tutorial 6

If you are new to development, plan on spending some time here before visiting the other forums.

Moderator: Moderators

My Questions About Tutorial 6

Postby jackson » Sat Aug 06, 2011 8:15 pm

Hello I'm Jackson and I have a few questions about tut 6.

First is, Convert CHS to LBA.

the formula is:
LBA = (cluster - 2) * sectors per cluster


ClusterLBA:
sub ax, 0x0002 ;ax = cluster.
xor cx, cx ;clear cx
mov cl, BYTE [bpbSectorsPerCluster] ;cl = the current byte of sectors per cluster
mul cx ;Why multiply cl by cx. Why not moveSectors Per Cluster into the cx and then multiply cx by ax?
add ax, WORD [datasector] ;Add ax to the datasector variable
ret ;return

My next question is about Convert LBA to CHS

The formula is:
absolute sector = (logical sector / sectors per track) + 1
absolute head = (logical sector / sectors per track) MOD number of heads
absolute track = logical sector / (sectors per track * number of heads)

LBACHS:
xor dx, dx ;clear dx which I'm guessing is thelogical sector
div WORD [bpbSectorsPerTrack] ; divide dx by sectors per track
inc dl ;Why increase dl instead of dx
mov BYTE [absoluteSector], dl ;absolute sector variable = dl
xor dx, dx ;clear
div WORD [bpbHeadsPerCylinder] ;Why divide by number of heads instead of sectors per track and then divide by number of heads and take the remainder(MOD)?
mov BYTE [absoluteHead], dl ;absolute head variable = dl
mov BYTE [absoluteTrack], al ;Why al?
ret ;ret

Thank you.
jackson
 
Posts: 14
Joined: Sat Aug 06, 2011 7:52 pm

Re: My Questions About Tutorial 6

Postby Andyhhp » Sat Aug 13, 2011 11:33 pm

Why multiply cl by cx. Why not moveSectors Per Cluster into the cx and then multiply cx by ax?


mul cx means "multiply ax by cx and store the result in ax:cx". In x86, multiplication is hardwired to use the [r][e]ax register, which is why you only specify the second operand.

There is no multiplication by cl. Remember that cl is physically part of cx. Therefore, the load on the previous line is setting up the cx register to be the second operand. The reason cl is used as opposed to cx is that you are reading a single byte from memory, which means the register you are storing it in must be a single byte long.


Why divide by number of heads instead of sectors per track and then divide by number of heads and take the remainder(MOD)?


div is even more wierd than mul. It implicitly used the dx as the LHS operand, and takes a register or memory value as the RHS operand. It will return the integer division result in dx, and will return the remainder (which is the mod) in ax. On x86, you always get the mod as well as the regular division result, by the way in which integer divison is calculated.

~Andrew
Image
Andyhhp
Moderator
 
Posts: 387
Joined: Tue Oct 23, 2007 10:05 am
Location: 127.0.0.1

Re: My Questions About Tutorial 6

Postby jackson » Sun Aug 14, 2011 2:22 pm

Thanks you. Now I understand.
jackson
 
Posts: 14
Joined: Sat Aug 06, 2011 7:52 pm


Return to Beginners

Who is online

Users browsing this forum: No registered users and 1 guest

cron