Assembler coding help needed.
Marcin Dalecki
mdcki at gmx.net
Sun Jan 11 11:18:35 PST 2004
Martin Nilsson wrote:
> I'm trying to find out why I can't boot 5.2 from USB CDROM on Supermicro
> motherboards. (I have an old Gateway P3 that can!).
>
> I've found out that that only 0x20 of 0x4c sectors of the loader are
> read in and it therfor traps when executed. (read is only called once).
>
> My last attempt at programming x86 assembler was ~15years ago so I'm a
> bit rusty :-)
>
> The below loop from cdboot.s is what I'm having problem understanding,
> how can this fail on one box but not on another?
>
> #
> # Load the binary into the buffer. Due to real mode addressing limitations
> # we have to read it in in 64k chunks.
> #
> mov DIR_SIZE(%bx),%eax # Read file length
> add $SECTOR_SIZE-1,%eax # Convert length to sectors
> shr $11,%eax
>
> %eax is 0x4c here on both machines!
>
> cmp $BUFFER_LEN,%eax
> jbe load_sizeok
> mov $msg_load2big,%si # Error message
> call error
> load_sizeok: movzbw %al,%cx # Num sectors to read
> mov DIR_EXTENT(%bx),%eax # Load extent
> xor %edx,%edx
> mov DIR_EA_LEN(%bx),%dl
> add %edx,%eax # Skip extended
> mov $MEM_READ_BUFFER,%ebx # Read into the buffer
> load_loop: mov %cl,%dh
> cmp $MAX_READ_SEC,%cl # Truncate to max read size
> jbe load_notrunc
> mov $MAX_READ_SEC,%dh
> load_notrunc: sub %dh,%cl # Update count
> push %eax # Save
> call read # Read it in
The fun will be ^^^^ here. The rest is self contained and
doesn't depend on CPU variant or periphery.
> pop %eax # Restore
> add $MAX_READ_SEC,%eax # Update LBA
> add $MAX_READ,%ebx # Update dest addr
> jcxz load_done # Done?
> jmp load_loop # Keep going
> load_done:
> _______________________________________________
> freebsd-hackers at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at freebsd.org"
>
>
More information about the freebsd-hackers
mailing list