📄 memdump.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 + -