汇编源码系列之burnout2008-04-30这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究....... COMMENT * Demo (and semi-useful) program to read/set burnout device parameters. Usage: burnout [ticks] [C+-] [V+-] [H+-] Parameters can be separated by almost anything. With no parameters, program simply returns current status. Examples: burnout 5000 (sets time to 5000 ticks) burnout 5000H+ (time=5000, use hardware blanking) burnout 5000,h+ (ditto, separators don"t matter) burnout c+h-v+ (continuous clear, software, monitor video) burnout /C+ /H- /V+ (ditto) burnout (return status only) Assembly/link: masm burnout; link burnout; (ignore NO STACK warning message) exe2bin burnout burnout.com By CJDunford 20-Mar-1985 Compuserve 76703,2002 ====================================================================== * stdout equ 1 ; DOS output files stderr equ 2 ; ----- General equates DOS equ 21H ; DOS interrupt TERMINATE equ 20H ; Exit to DOS PRINT equ 09H ; DOS "print" string to stdout FOPEN equ 3D02H ; DOS file open, read/write FREAD equ 3FH ; DOS file read FWRITE equ 40H ; DOS file write CR equ 13 ; ASCII carriage return LF equ 10 ; ASCII line fine code segment assume cs:code,ds:code org 80H ; Parm storage area in PSP ParmLength label byte ; Length of parms org 81H Parameters label byte ; Start of parms org 100H ; Org for .COM main proc far jmp start ; Hate to execute data DevName db "BRNDEV",0 ; Burnout device name handle dw ? ; Storage for handle Flush db "@" ; Char to flush device I/O Execute db "#" ; Char to execute device commands NotInstalled db "Burnout device is not installed",13,10 NotInstalledL equ $ - NotInstalled Status db "Current status: " ; Status message StatInsert db 40 dup (?) ; brndev will store status here ; ----- Open the device start: mov dx,offset DevName ; DS:DX => device name mov ax,FOPEN int DOS jnc A1 ; Continue if no error mov bx,stderr ; Message to stderr mov cx,NotInstalledL mov dx,offset NotInstalled mov ah,FWRITE int DOS jmp exit ; ----- Flush any pending I/O to/from the device A1: mov handle,ax ; Save device handle mov dx,offset Flush ; Point to the "@" mov cx,1 ; Writing one byte mov bx,handle ; Device handle mov ah,FWRITE ; Write "@" to device int DOS ; ----- Send and execute parameters if present mov cl,ParmLength ; Parm length to CL or cl,cl ; Any parms present? jz A2 ; Skip if not xor ch,ch ; CX = parm length mov dx,offset Parameters ; DS:DX => parms mov bx,handle ; BX = device handle mov ah,FWRITE ; Write parms to device int DOS mov dx,offset Execute ; Execute the parms mov cx,1 ; Writing one byte mov bx,handle ; Device handle mov ah,FWRITE ; Write "#" to device int DOS ; ----- Get and display device status A2: mov dx,offset StatInsert ; DS:DX => where to put status mov cx,0FFH ; Ask for lots of data; DOS will ... ; ... fetch only until CR found. mov bx,handle ; Device handle mov ah,FREAD ; Read device info int DOS mov cx,ax ; CX = actual # bytes read mov di,offset StatInsert ; Where the stat data is stored add di,cx ; Add length of input read mov al,CR ; Store a CR/LF/"$" at end cld stosb mov al,LF stosb mov al,"$" stosb mov dx,offset Status ; Write status to stdout mov ah,PRINT int DOS exit: int TERMINATE ; Exit to DOS main endp code ends end main