Re: [問題] show出register的值
※ 引述《fancyrex (0℃)》之銘言:
: 想請問一個問題,
: 該怎麼把暫存器的值print出來?
: example
: .model small
: .586
: .stack
: .data
: .code
: begin: mov ax,@data
: mov ds,ax
: mov dx,1111h
: mov ah,9h
: int 21h
: end begin
: 目前還沒找到方法,所以想請問一下各位前輩。
: 感謝!
用 NASM 寫的,適用8086以上的CPU,推薦用軟體 emu8086 做追蹤,程式碼連結在:
http://src.wtgstudio.com/?dPFn52
是寫成 Boot Sector,可用來印出暫存器CS跟暫存器IP的值,稍微改一下應該也可以
用來印其他暫存器。
--
前陣子小弟發現用可開機光碟在 Virtual PC 2007 跑的時候,Boot Sector 不會載入到
IP = 7C00 處,現在發現了,原來是會被載入到 07C0:0000 處。
避免程式連結會失效,程式碼也貼在這篇內,分隔線以下就是:
========================================================================
;可分別印出 CS、IP 兩個暫存內容值的 Boot Sector
call L
L: pop cx ;取得IP之值 ;用 nasm 2.06rc2 做 compile 時,這行佔 1 byte
add cx,0x0008 ;用 nasm 2.06rc2 做 compile 時,這行佔 4 byte
call start ;用 nasm 2.06rc2 做 compile 時,這行佔 3 byte
table db '0123456789ABCDEF' ;cx = table的絕對位址。若程式從 0000:7C00 載入,
則 cx = 7C00 + 000B
;table可用來搭配 XLATB 指令:
http://www.ltivs.ilc.edu.tw/kocp/mpu/m4/m4-2-1.htm
start:
;-----------
;移動游標到座標(0,0)
mov dx,0x0000
call MovCur
;印字I
mov al,0x49
call ShowChr
;移動游標到座標(1,0)
mov dx,0x0001
call MovCur
;印字P
mov al,0x50
call ShowChr
;移動游標到座標(2,0)
mov dx,0x0002
call MovCur
;印字=
mov al,0x3D
call ShowChr
;-----------
;移動游標到座標(3,0)
mov dx,0x0003
call MovCur
;印IP-1
mov ax,cx
and ax,0xF000
shr ax,12 ;把第一高位元組的值移到al去
call proc
;移動游標到座標(4,0)
mov dx,0x0004
call MovCur
;印IP-2
mov ax,cx
and ax,0x0F00
shr ax,8 ;把第二高位元組的值移到al去
call proc
;移動游標到座標(5,0)
mov dx,0x0005
call MovCur
;印IP-3
mov ax,cx
and ax,0x00F0
shr ax,4 ;把第三高位元組的值移到al去
call proc
;移動游標到座標(6,0)
mov dx,0x0006
call MovCur
;印IP-4
mov ax,cx
and ax,0x000F
call proc
;-----------
;移動游標到座標(0,1)
mov dx,0x0100
call MovCur
;印字C
mov al,0x43
call ShowChr
;移動游標到座標(1,1)
mov dx,0x0101
call MovCur
;印字S
mov al,0x53
call ShowChr
;移動游標到座標(2,1)
mov dx,0x0102
call MovCur
;印字=
mov al,0x3D
call ShowChr
;移動游標到座標(3,1)
mov dx,0x0103
call MovCur
;印CS-1
mov ax,cs
and ax,0xF000
shr ax,12
call proc
;移動游標到座標(4,1)
mov dx,0x0104
call MovCur
;印CS-2
mov ax,cs
and ax,0x0F00
shr ax,8
call proc
;移動游標到座標(5,1)
mov dx,0x0105
call MovCur
;印CS-3
mov ax,cs
and ax,0x00F0
shr ax,4
call proc
;移動游標到座標(6,1)
mov dx,0x0106
call MovCur
;印CS-4
mov ax,cs
and ax,0x000F
call proc
;移動游標到座標(7,1)
mov dx,0x0107
call MovCur
;-----------
jmp $ ;暫停於此
MovCur:
mov ah,02h
mov bx,0x0000
int 10h
ret
proc:
add al,0x30 ;令al的值變 printable 的 ascii
call ShowChr
ret
ShowChr:
mov ah,0x09 ;中斷模式設定:游標處印字元
mov bx,0x000c ;bl= 0ch表印出紅色字
push cx
mov cx,0x0001 ;設定要印出多少個字元
int 10h
pop cx
ret
times 510-($-$$) db 0 ;($-$$)的意思「在此例」的意思,是計算這行之前已經出
現的位元組數有多少
dw 0xaa55
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 124.8.143.200
推
02/28 09:11, , 1F
02/28 09:11, 1F
→
02/28 09:31, , 2F
02/28 09:31, 2F
→
02/28 09:32, , 3F
02/28 09:32, 3F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):