作者zlw (洞房不败)
看板ASM
标题Re: [问题] show出register的值
时间Fri Feb 27 22:20:30 2009
※ 引述《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
1F:推 R119:在x86 real mode中 07C0:0000记忆体位址 = 7C00 02/28 09:11
2F:→ zlw:嗯,只不过像这样由BIOS载入的程式,通常都会用org 0x7c00告知 02/28 09:31
3F:→ zlw:组译器载入位址在那边。突然变0000弄出来的位址就会错误了 02/28 09:32