⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memdump.asm

📁 汇编,将内存的自定地址开始的1m空间的内容显示出来
💻 ASM
字号:
;***************************************
memdump segment
        assume  cs:memdump,ds:memdump
        org     100h
;---------------------------------------
start:  jmp     begin
seg_adr dw      0           ;007
off_adr dw      0           ;008
row     db      ?           ;009
msg     db      ' Seg:Off  00 01 02 03 04 05 06 07-08 09 0A '
        db      '0B 0C 0D 0E 0F  01234567-89ABCDEF',0dh,0ah,'$'
ipt_of  db      ' Input offset address : $'
ipt_sg  db      'Input segment address : $'
begin:  call    print_msg   ;014

        mov     row,3       ;016 由第四列開始
nxt_rw: mov     ah,2        ;017 設定AH為游標定位
        mov     dl,0
        mov     dh,row
        mov     bh,0
        int     10h         ;021 呼叫INT 10H中斷
        mov     bx,seg_adr  ;022 將要印的區段放入BX
        mov     es,bx       ;023 設定區段,以利往後將記憶體內容取出
        call    print_bx_hex;024 印出
        mov     dl,':'
        call    print
        mov     bx,off_adr
        call    print_bx_hex
        mov     dl,' '
        call    print       ;030 印出空格

        mov     si,off_adr
        mov     ch,10h      ;033 每列印出16個位元組
nxt_col_0:
        mov     bl,es:[si]  ;035 取出記憶體內容存於 BL
        call    print_bl_hex    ;036 印出記憶體內容
        mov     dl,' '      ;037 印出空白
        mov     ax,si
        and     al,0fh      ;038 檢查是要印空白或『-』
        cmp     al,7
        jne     pnt_sp      ;041 若是AL=7要印出『-』
        mov     dl,'-'      ;042 印出『-』
pnt_sp: call    print       ;043 印出
        inc     si          ;044 指向下一個位址
        dec     ch          ;045 檢查是否已印完16個位元組了?
        jnz     nxt_col_0

        mov     dl,' '      ;048 記憶體的內容已印完,印出ASCII字元
        call    print
        mov     si,off_adr  ;050 要印出ASCII字元,故重新取回偏移位址
        mov     ch,10h
nxt_col_1:                  ;052 判斷要不要印『-』
        mov     ax,si
        and     al,0fh
        cmp     al,8
        jne     nt_pnt
        mov     dl,'-'
        call    print
nt_pnt: mov     dl,es:[si]  ;059 取出記憶體
        cmp     dl,' '      ;060 若ASCII碼小於1Fh,則印出空白
        jae     ok_pnt
        mov     dl,' '
ok_pnt: call    print
        inc     si
        dec     ch          ;065 檢查是否已印完16個ASCII字元了?
        jnz     nxt_col_1

        inc     row
        mov     off_adr,si  ;069 指向下一個16位元組記憶體的前端
        cmp     row,23      ;070 是否已印完一頁?
        jnz     nxt_rw
press_key:                  ;072 已印完一頁,等使用者按鍵
        mov     ah,0
        int     16h
        cmp     ah,01h
        je      esc_key     ;076 按下Esc鍵
        cmp     ah,1fh
        je      s_key       ;078 按下S鍵
        cmp     ah,18h
        je      o_key       ;080 按下O鍵
        cmp     ah,49h
        je      pgup        ;082 按下PgUp鍵
        cmp     ah,51h
        jne     press_key

pgdn:   jmp     begin       ;086 按下PgDn鍵

pgup:   sub     off_adr,140h*2
        jmp     begin

s_key:  mov     cx,offset ipt_sg
        call    input
        mov     seg_adr,bx
        sub     off_adr,140h
        jmp     begin

o_key:  mov     cx,offset ipt_of
        call    input
        and     bx,0fff0h
        mov     off_adr,bx
        jmp     begin

esc_key:
        mov     ax,4c00h
        int     21h         ;105 結束程式返回DOS
;---------------------------------------
print_msg       proc    near
        mov     ah,2
        mov     dx,100h
        mov     bh,0
        int     10h
        mov     dx,offset msg
        mov     ah,9
        int     21h
        mov     cx,76       ;115 115到116的目的是
next_c: mov     dl,0cdh     ;116 印出第2列的雙橫線
        mov     ah,2
        int     21h
        loop    next_c      ;119
        ret
print_msg       endp
;---------------------------------------
;在銀幕上印出 BL 的十六進位數
;輸入:BL
print_bl_hex    proc    near
        mov     cl,4
        rol     bl,cl
        call    print_4_bits
        rol     bl,cl
        call    print_4_bits
        ret
print_bl_hex    endp
;---------------------------------------
;目的:在銀幕上印出 BX 之十六進位值
;輸入:BX
print_bx_hex    proc    near  ;136
        mov     cl,4
        rol     bx,cl
        call    print_4_bits
        rol     bx,cl
        call    print_4_bits
        rol     bx,cl
        call    print_4_bits
        rol     bx,cl
print_4_bits:
        mov     dx,bx
        and     dl,0fh
        add     dl,30h
        cmp     dl,3ah
        jb      print
        add     dl,7
print:  mov     ah,2
        int     21h
        ret
print_bx_hex    endp
;---------------------------------------
;目的:輸入一個十六進位數
;輸入:DX-提示字串
;輸出:BX-輸入的十六進位數
input   proc    near
        mov     ah,2
        mov     dx,1700h
        mov     bh,0
        int     10h
        mov     ah,9
        mov     dx,cx
        int     21h

        mov     cx,2004h
        sub     bx,bx
next:   mov     ah,0
        int     16h     ;172 呼叫BIOS鍵盤服務程式
        cmp     al,0dh  ;173 若輸入Enter鍵表示要輸入完成
        je      ok1
        mov     dl,al   ;175 將輸入的ASCII碼存入DL以利印在螢幕上
        cmp     al,'0'  ;176 檢查輸入的ASCII碼是否為阿拉伯數字
        jb      next
        cmp     al,'9'
        ja      alpha   ;179 若否,則檢查是否為A到F的英文字
        sub     al,'0'  ;180 減去30h,以得到十六進位數
        jmp     short ok0
alpha:  and     al,0dfh ;182
        mov     dl,al
        sub     al,37h  ;184 檢查是否為A到F的英文字
        cmp     al,0ah
        jb      next
        cmp     al,0fh
        ja      next    ;188

ok0:    push    ax      ;190
        call    print   ;191 在螢幕上印出輸入的字
        pop     ax
        mov     cl,4    ;193 將BX乘以16d
        shl     bx,cl
        cbw
        add     bx,ax   ;196 使BX加上輸入的16進位數
        dec     ch
        jz      ok1
        mov     dh,bh   ;199 檢查是否超過BX容量
        and     dh,0f0h
        jz      next    ;201 沒超過

ok1:    push    bx      ;203
        mov     ah,2
        mov     dx,1700h
        mov     bh,0
        int     10h
        pop     bx
        mov     cx,57   ;209 209到213的目的是當輸入完
ok2:    mov     ah,2    ;210 成後,清除螢幕上第23行的字
        mov     dl,' '
        int     21h
        loop    ok2     ;213
        ret
input   endp
;---------------------------------------
memdump ends
;***************************************
        end     start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -