敬业的IT人 >> 编程开发 >> 其他语言 >> 汇编源码--showmem

汇编源码--showmem

敬业的IT人 互联网 佚名 2008-2-19 16:15:22
    ·汇编源码--BRK
    ·汇编源码--CLOCK
    ·汇编源码--BURNOUT
    ·汇编源码--DOSSYM
    ·汇编源码--circle
    ·汇编源码--DEV
    ·汇编源码--getspace
    ·汇编源码--CLEAR
    ·汇编源码--col
    ·汇编源码--gameport
;************************************************************************ ;* ;* SHOWMEM (C) 1997 R ;wanna quit ? je quit ;yeahh jmp dopage errout: call write quit: mov ax,exit int msdos ;*********************************************************** ;* Convert ascii hex to 32 bit binary ;* Input = command line buffer, output EDX ;*********************************************************** hexbin: mov si,inbuff ;pointer command line buffer xor edx,edx ;clear binary output aschexbin: lodsb cmp al,'0' ;< 0 jb notasc ;yes invalid character cmp al,'9' ;<= 9 jbe astrip ;yes, strip high 4 bits and al,05fh ;force upper case cmp al,'A' ;< ascii A jb notasc ;yes, invalid character cmp al,'F' ;> ascii F ja notasc ;yes, invalid character add al,9 ;ok, add 9 for strip astrip: and al,0fh ;strip high 4 bits mov cx,4 ;set shift count shl edx,cl ;rotate EDX 4 bits xor ah,ah ;zero out AH cbw add edx,eax ;add digit to value jmp aschexbin ;continue notasc: ret ;********************************************************************* ;* Format and show the stuff in a "sector" ;* Input SI ;********************************************************************* showpage: mov cx,32 ;32*16=512 arow: push cx mov di,outline ;output buffer mov cx,16 ;process 16 bytes hexrow: push cx lodsb ;load al with byte mov dl,al ;get value mov cx,2 ;2 nibbles chexb: push cx ;save that mov cl,4 ;4 bits rol dl,cl ;rotate source left mov al,dl ;move digit into AL and al,15 ;clear high nibble daa ;adjust AL if A through F add al,240 ;bump the carry adc al,40h ;convert HEX to ASCII stosb ;copy to buffer pop cx ;get digit counter loop chexb ;next digit mov al,32 ;copy a SPACE stosb pop cx ;restore loop counter loop hexrow ;loop on mov al,32 ;copy 2 spaces stosb stosb sub si,16 ;adjust source back mov cx,16 ;copy ASCII bytes cccp: lodsb cmp al,32 ;< SPACE ? jb noa ;yeahh, skip it stosb ;no, store in buffer jmp next noa: mov al,'.' stosb next loop cccp mov al,13 stosb mov al,10 stosb mov al,0 ;null terminate line stosb mov bx,outline ;show the line call write pop cx cmp cx,17 jne nopause push ds mov ax,cs mov ds,ax mov bx,text1 call write pop ds xor ah,ah int kbd nopause: loop arow ;next 16 bytes ret ;************************************************************************' ;* Convert bin WORD to HEX ascii. Input DX. Result in Numbuff * ;************************************************************************ binhex: pusha mov di,numbuff ;destination buffer mov dx,[count] ;binary number mov cx,4 ;four nibbles convhex: push cx ;save counter mov cl, 4 ;4 bits rol dx, cl ;rotate source left mov al, dl ;move digit into AL and al, 15 ;clear high nibble daa ;adjust AL if A through F add al, 240 ;bump the carry adc al, 40h ;convert HEX to ASCII stosb ;copy to buffer pop cx ;get digit counter loop convhex ;next digit mov al,32 ;copy a space stosb mov al,0 ;null terminate stosb popa ret ;************************************************************************* ;* Writes out the NULL terminated text supplied in BX. * ;* OR writes out data,BX and size,CX if called at lwrite. * ;************************************************************************* write: pusha mov si,bx ;copy to SI mov cx,0 ;clear count wloop: lodsb ;load AL with SI cmp al,0 ;end of line ? je lwrite ;yeahh inc cx ;no, incrase byte count jmp wloop ;test next byte lwrite: mov dx,bx ;text address in DX mov bx,1 ;filehandle standard output = 1 mov ah,writef ;MS-DOS writefile with handle is 040 int msdos ;write buffer to standard output popa ret ;done ;************************************************************************* ;* My kind of command line parsing. It just checks if there飐 ;* any blankspaces between the options. The parameters ends up ;* in the inbuff separated by 0:s, binary zeroes. ;************************************************************************* parse: mov di,inbuff ;our buffer ifspc: cmp byte [si],32 ;leading space ? jne nospc ;noo inc si ;yeahh, dump that jmp ifspc ;check next nospc: mov cx,1 ;were here, so we got one arg copy1: lodsb ;load byte SI to AL cmp al,0 ;0 ?(end of line) je done ;yeahh cmp al,32 ;SPACE ? je cop2 ;yeah stosb ;noo, move AL to DI, incrase DI jmp copy1 ;go on cop2: mov byte [di],0 ;null terminate add cx,1 inc di ;dump that byte(SPACE) jmp copy1 ;back done: mov byte [di],0 ;null terminate ret ;return ;*************************** DATA STUFF ********************************** XMS_SEGMENT dw 0 XMS_OFFSET dw 0 inbuff times 64 dw 0 ;128 byte command line buffer outline times 40 dw 0 ;buffer output line numbuff times 7 dw 0 ;word ascii number buffer comseg dw 0 count dw 0 bcount dw 0 acount dw 0 ;outbuff times 512 db 0 utext db 'Showmem (C) 1997 RonSoft.',13,10 db 'Usage: Showmem [start address].',13,10 db 'Start address = Hexadecimal.',13,10,0 text: db 13,10,'Q = Quit. Any key = Next page.',13,10,0 text1: db 13,10,'Any Key = Next 256 Bytes.',13,10,0 errt1: db 'That address is not hexadecimal.',13,10,0 s2: END 进入讨论组讨论。
粤ICP备06119539号
Copyright CiscoSky.Org,Some Rights Reserved.
Email:me1228#tom.com