AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > 汇编语言

汇编源码--showmem

51自学网 http://www.51zixue.net
;************************************************************************;*;*      SHOWMEM (C) 1997 RonSoft.                                       *;*                                                                      *;*      A little utility thats shows what's in a given mem position.    *;*      Usage:                                                          *;*      Showmem                            *;*      Where segment and offset are 16 bit hexadecimal values or       *;*      a single 32 bit value.                                          *;*      Just like this:                                                 *;*      Showmem 00000000 or Showmem 0.                                  *;*                                                                      *;*      Ronald Nordberg.                                                *;*      Silverv刧en 3                                                   *;*      907 50 Ume?                                                    *;*      Sweden                                                          *;*      christine.martinson@swipnet.se                                  *;*      http://home2.swipnet.se/~w-20064                                *;*                                                                      *;*      THIS IS ALL PUBLIC DOMAIN FREEWARE.                             *;*      LET EM KNOW IF YOU USE MY CODE.                                 *;*                                                                      *;************************************************************************                                        ;some euqates for readabilitykbd             equ     16h             ;keyboard irqmsdos           equ     21h             ;MSDOS irqreset           equ     0dh             ;disk resetdfopen          equ     0fh             ;open disk filedfclose         equ     10h             ;close disk filesearchf         equ     11h             ;search firstsearchn         equ     12h             ;search nextseqread         equ     14h             ;sequential disk readseqwrite        equ     15h             ;     "       "  writesetdta          equ     1ah             ;set disk transfer area addresscreatef         equ     3ch             ;create file with handleopenf           equ     3dh             ;open file with handleclosef          equ     3eh             ;close file with handlereadf           equ     3fh             ;read from file with handlewritef          equ     40h             ;write to file with handlesetfp           equ     42h             ;set file pointerallocmem        equ     48h             ;allocate memoryfreemem         equ     49h             ;free memorychangebs        equ     4ah             ;change block sizefindfirst       equ     4eh             ;find first fileexit            equ     4c00h           ;msdos exit[BITS 16]                               ;NASM stuff[ORG 0x100]s1:        mov     ax,cs                   ;get code segment        mov     ds,ax                   ;use it now        mov     [comseg],ds             ;save it there                mov     si,0080h                ;DOS command line page 0        lodsb                           ;load size of command line        cmp     al,0                    ;anything on command line ?        jbe     usage                   ;noo, show usage        cbw                             ;extend AL to AX        xchg    bx,ax                   ;swap size to bx for indexing        mov     byte [bx+si],0          ;null terminate command line        call    parse                   ;parse command line        jmp     main                    ;go on with mainusage:  mov     bx,utext                ;pointer usage text        jmp     errout                  ;skip thismain:        mov     si,inbuff               ;check for valid HEX input        mov     bx,errt1                ;proper textishex:  lodsb                           ;get the char        cmp     al,'0'        jb      errout        and     al,0dfh                 ;force UPPERCASE        cmp     al,'F'                  ;>F ?        ja      errout                  ;yeahh, dump this        loop    ishex        call    hexbin                  ;make hex bin                                        ;start address now in EDX        mov     ax,dx                   ;get low word (segment)        mov     es,ax                   ;start segment        shr     edx,16                  ;shift in offset        mov     di,dx                   ;start offsetdopage:        push    es                      ;save registers        push    di        push    ds        push    si        mov     ax,es        mov     ds,ax                   ;make ds=es        mov     si,di                   ;and si=di        call    showpage                ;show it        pop     si                      ;restore registers        pop     ds        pop     di        pop     es        add     di,512                  ;adjust memory position        ;xor     ah,ah                  ;wait for ANY key        ;int     kbd        mov     bx,text                 ;show message        call    write        mov     ah,0                    ;wanna see next screen  ?        int     kbd                     ;chek out keyboard buffer        and     al,0DFh                 ;force UPPER CASE        cmp     al,"Q"                  ;wanna quit ?        je      quit                    ;yeahh        jmp     dopageerrout:        call    writequit:           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 outputaschexbin:        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 stripastrip:        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               ;continuenotasc: ret;*********************************************************************;*      Format and show the stuff in a "sector";*      Input SI;*********************************************************************showpage:        mov     cx,32                   ;32*16=512arow:   push    cx        mov     di,outline              ;output buffer        mov     cx,16                   ;process 16 byteshexrow: push    cx        lodsb                           ;load al with byte        mov     dl,al                   ;get value        mov     cx,2                    ;2 nibbleschexb:  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 bytescccp:   lodsb        cmp     al,32                   ;< SPACE ?        jb      noa                     ;yeahh, skip it        stosb                           ;no, store in buffer        jmp     nextnoa:    mov     al,'.'        stosbnext    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     kbdnopause:        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 nibblesconvhex:        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 countwloop:  lodsb                           ;load AL with SI        cmp     al,0                    ;end of line ?        je      lwrite                   ;yeahh        inc     cx                      ;no, incrase byte count        jmp     wloop                   ;test next bytelwrite: 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 bufferifspc:  cmp     byte [si],32            ;leading space  ?        jne     nospc                   ;noo        inc     si                      ;yeahh, dump that        jmp     ifspc                   ;check nextnospc:  mov     cx,1                    ;were here, so we got one argcopy1:  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 oncop2:   mov     byte [di],0             ;null terminate        add     cx,1        inc     di                      ;dump that byte(SPACE)        jmp     copy1                   ;backdone:   mov     byte [di],0             ;null terminate        ret                             ;return;*************************** DATA STUFF **********************************XMS_SEGMENT     dw 0XMS_OFFSET      dw 0inbuff          times 64 dw 0           ;128 byte command line bufferoutline         times 40 dw 0           ;buffer output linenumbuff         times 7 dw 0            ;word ascii number buffercomseg          dw 0count           dw 0bcount          dw 0acount          dw 0;outbuff         times 512 db 0utext           db      'Showmem (C) 1997 RonSoft.',13,10                db      'Usage: Showmem [start address].',13,10                db      'Start address = Hexadecimal.',13,10,0text:           db      13,10,'Q = Quit. Any key = Next page.',13,10,0text1:          db      13,10,'Any Key = Next 256 Bytes.',13,10,0errt1:          db      'That address is not hexadecimal.',13,10,0s2:END

 

 

 
上一篇:汇编源码--sertype  下一篇:汇编源码--sound