汇编源码系列之getsect2008-04-30这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究....... ; Absolute Disk Read: GETSEC ( uses BIOS interrupt 0x25 ) ; ; Interfaces to Computer Innovations C-86 "c" compiler V1.32 (& later) ; See DOS 2.10 Technical Reference page 5-10, and Technical Reference ; page A-32. This code was written by Mike Sirmans (05-25-84). ; -------------------------------------------------------------------- ; THIS ROUTINE IS POWERFUL. (AND AS SUCH, IS DANGEROUS IN THE WRONG ; HANDS). BE CAREFUL HOW YOU USE IT. I ASSUME NO RESPONSIBILITY. ; -------------------------------------------------------------------- ; ; Synopsis: int getsec(drive,numsec,begsec,buffer) ; unsigned int drive; /* 0=A, 1=B, etc. */ ; unsigned int numsec; /* Number of sectors to read */ ; unsigned int begsec; /* Beginning logical sector */ ; char *buffer; /* Transfer address */ ; ; Function: The number of sectors specified are transferred ; between the given drive and the transfer address. ; LOGICAL SECTOR NUMBERS are obtained by numbering ; each sector sequentially starting from track 0, head 0, ; sector 1 (logical sector 0) and continuing along the ; same head, then to the next head until the last sector ; on the last head of the track is counted. Thus, ; logical sector 1 is track 0, head 0, sector 2, ; logical sector 2 is track 0, head 0, sector 3, & so on. ; ; Returns: NULL if the operation is successful. ; otherwise, error codes are as follows: ; ; hex 80 Attachment failed to respond. ; hex 40 SEEK operation failed. ; hex 20 Controller failure. ; hex 10 Bad CRC on diskette read. ; hex 08 DMA overrun on operation. ; hex 04 Requested sector not found. ; hex 03 Write attempt on write-protected diskette. ; hex 02 Address mark not found. ; hex FF Unspecified (error other than those above). ; code segment byte public ;segment registers remain intact assume cs:code ;all other registers will be destroyed public getsec getsec: push bp ;save old frame pointer mov bp,sp ;get new frame pointer mov ax,4[bp] ;put drive number into AL xor ah,ah mov cx,6[bp] ;number of sectors to fetch mov dx,8[bp] ;logical record number of 1st sector mov bx,10[bp] ;pointer to transfer address int 25h ;BIOS call jc error ;error has occurred if carry flag = 1 mov al,00H ;NULL to indicate sucessful completion jmp done error: cmp al,00H ;detect unspecified error code 00H jne done ;...change to 0FFh if found to mov al,0FFH ;...differentiate it from success code done: xor ah,ah ;return AL only popf ;remove flags int 0x25 left on stack pop bp ;restore original frame pointer ret ;all done code ends end