Understanding Assembly Code

Unity's Avatar, Join Date: May 2013
Newbie Member
Hi,

My knowledge regarding assembly code is very limited and I wanted to ask if someone could help figure out what the following is doing? There is a routine that calls the disk (this is code loaded directly by BIOS) and I would like to know where this is and how it is executed:

Code:
//allow interrupts
:0000                 cli
//ax=0
:0001                 xor       ax, ax
//ss=ax(=0)
:0003                 mov     ss, ax
//sp=0x7c00
:0005                 mov     sp, 7C00h
//si=sp
:0008                 mov     si, sp
//es=ax(=0)
:000A                 push    ax
:000B                 pop     es
//ds=ax(=0)
:000C                 push    ax
:000D                 pop     ds
:000E                 sti
:000F                 cld
//di=0x600
//cx=0x100
:0010                 mov     di, 600h
:0013                 mov     cx, 100h
:0016                 rep movsw
//
//
:0018                 jmp     far ptr 0:61Dh
//dh=0
//cx=2
//di=5
:001D                 mov     dh, 0
:001F                 mov     cx, 2
:0022                 mov     di, 5
:0025
:0025 loc_25:      
//bx=0x700
//ax=0x201                        
:0025                 mov     bx, 700h
:0028                 mov     ax, 201h
//di=16 bit destination register
:002B                 push    di
// AX= AH | AL=0x201
// CX=CH | CL = 2
//AL=1=> number of sector to read =1
//AH=2 => int 13h will be READ SECTORS INTO MEMORY
// CH=track=0
// CL= sector = 2
//this code reads the second sector, that is to say the data from 0x200 to 0x3FE.
:002C                 int     13h             ; DISK - READ SECTORS INTO MEMORY
:002C                                         ; AL = number of sectors to read, CH = track, CL = sector
:002C                                         ; DH = head, DL = drive, ES:BX -> buffer to fill
:002C                                         ; Return: CF set on error, AH = status, AL = number of sectors read
:002E                 pop     di
//will jump if CF=0
:002F                 jnb     short loc_3D
//ax=0
//CX=3 => track=0 and sector =3
:0031                 xor     ax, ax
// AL=AH=0
//the disk is reseted
:0033                 int     13h             ; DISK - RESET DISK SYSTEM
:0033                                         ; DL = drive (if bit 7 is set both hard disks and floppy disks reset)
//di--
//the destination counter is decremented
:0035                 dec     di
//jump if ZF is set
//untill di=0 we loop
:0036                 jnz     short loc_25
//end of loop, di=0
//si=source index
//si=0x68A
:0038                 mov     si, 68Ah
//jump to next block
:003B                 jmp     short loc_78
:003D ; ---------------------------------------------------------------------------
:003D
:003D loc_3D:                      
//cx=3
:003D                 mov     cx, 3
:0040
:0040 loc_40:                                 ; DATA XREF: :0083#r
:0040                 mov     di, 5
:0043
:0043 loc_43:                                 ; CODE XREF: :0059#j
:0043                 mov     bx, 2000h
:0046                 push    bx
:0047                 pop     es
:0048                 assume es:nothing
:0048                 mov     bx, 0
:004B                 mov     ax, 220h        ; DATA XREF: :002C#r
:004B                                         ; :0033#r ...
:004E                 push    di
:004F                 int     13h             ; DISK - READ SECTORS INTO MEMORY
:004F                                         ; AL = number of sectors to read, CH = track, CL = sector
:004F                                         ; DH = head, DL = drive, ES:BX -> buffer to fill
:004F                                         ; Return: CF set on error, AH = status, AL = number of sectors read
:0051                 pop     di
:0052                 jnb     short loc_60
:0054                 xor     ax, ax
:0056                 int     13h             ; DISK - RESET DISK SYSTEM
:0056                                         ; DL = drive (if bit 7 is set both hard disks and floppy disks reset)
:0058                 dec     di
:0059                 jnz     short loc_43
:005B                 mov     si, 68Ah
:005E                 jmp     short loc_78
:0060 ; ---------------------------------------------------------------------------
:0060
:0060 loc_60:                                 ; CODE XREF: :0052#j
:0060                 mov     cx, 3FFFh
:0063                 mov     si, 800h
:0066                 xor     di, di
:0068
:0068 loc_68:                                 ; CODE XREF: :0071#j
:0068                 lodsw
:0069                 and     si, 0FFBFh
:006C                 xor     ax, es:[di]
:006F                 stosw
:0070                 dec     cx
:0071                 jnz     short loc_68
:0073                 jmp     far ptr 2000h:0
:0078 ; ---------------------------------------------------------------------------
:0078
:0078 loc_78:                                 ; CODE XREF: :003B#j
:0078                                         ; :005E#j ...
:0078                 lodsb
:0079                 cmp     al, 0
:007B                 jz      short loc_88
:007D                 push    si
:007E                 mov     bx, 7
:0081                 mov     ah, 0Eh
:0083                 int     10h             ; - VIDEO - WRITE CHARACTER AND ADVANCE CURSOR (TTY WRITE)
:0083                                         ; AL = character, BH = display page (alpha modes)
:0083                                         ; BL = foreground color (graphics modes)
:0085                 pop     si
:0086                 jmp     short loc_78
:0088 ; ---------------------------------------------------------------------------
:0088
:0088 loc_88:                                 ; CODE XREF: :007B#j
:0088                                         ; :loc_88#j
:0088                 jmp     short loc_88
:008A ; ---------------------------------------------------------------------------
If more information is needed Ill try my best to provide as much detail as possible.

Thanks!
0
Unity's Avatar, Join Date: May 2013
Newbie Member
Can a mod please move this to the assembly code section, thanks.
0
shabbir's Avatar, Join Date: Jul 2004
Go4Expert Founder
Quote:
Originally Posted by Unity View Post
Can a mod please move this to the assembly code section, thanks.
Done.