Re: [問題] show出register的值

看板ASM作者 (洞房不敗)時間15年前 (2009/02/27 22:20), 編輯推噓1(102)
留言3則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《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
在x86 real mode中 07C0:0000記憶體位址 = 7C00
02/28 09:11, 1F

02/28 09:31, , 2F
嗯,只不過像這樣由BIOS載入的程式,通常都會用org 0x7c00告知
02/28 09:31, 2F

02/28 09:32, , 3F
組譯器載入位址在那邊。突然變0000弄出來的位址就會錯誤了
02/28 09:32, 3F
文章代碼(AID): #19f_Qllb (ASM)
討論串 (同標題文章)
文章代碼(AID): #19f_Qllb (ASM)