关于jmp段间转移
在网上看了个代码,类似这样的
jmp _go_init,INIT_SETUP
我下载的nasm编译工具好像不支持jmpi,所以我想换成jmp,下面是代码,不知道对不对.
jmp [ INIT_SETUP + _go_init ]
但是执行后并没有预想的结果,"load loader"字符串没有打印出来,哪位高手帮忙看看,下面是全部代码,谢谢.
; name : boot
; writer : jues
; home : http://blog.sina.com.cn/xiaogeyou
; date : 2012-08-01
;----------------------------------------------------
%define BOOT_SETUP 07c00h
%define INIT_SETUP 09000h
%define LOADER_SETUP 09200h
;----------------------------------------------------
org BOOT_SETUP
jmp _start ;start exec
;----------------------------------------------------
; string
start_boot db 'boot'
start_boot_len equ $-start_boot
load_loader db 'load loader'
load_loader_len equ $-load_loader
;string line number
string_line db 00h
;----------------------------------------------------
_print:
mov bp,ax
mov cx,bx
mov ax, 01301h
mov bx, 000fh
;----------------------------------------------------
;auto next line show
mov dl,0h
mov dh,[ string_line ]
int 10h
add dh,1h
mov [ string_line ],dh
ret
;----------------------------------------------------
;start here
_start:
mov ax,cs
mov ds,ax
mov es,ax
mov ax,start_boot
mov bx,start_boot_len
call _print
call _init_setup ;copy boot to INIT_SETUP
jmp [ INIT_SETUP + _go_init ]
_go_init:
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
call _load_loader
ret
;----------------------------------------------------
;copy boot from BOOT_SETUP to INIT_SETUP
_init_setup:
mov ax,BOOT_SETUP
mov ds,ax
mov ax,INIT_SETUP
mov es,ax
mov cx,100h ;256*2 = 512(boot size)
sub si,si
sub di,di
rep
movsw
ret
;----------------------------------------------------
_load_loader:
mov ax,load_loader
mov bx,load_loader_len
call _print
ret
;----------------------------------------------------
times 510-($-$$) db 0
; true boot end string
dw 0xaa55
;----------------------------------------------------
[解决办法]
对 nasm 不熟悉。如果不确定自己的代码是否合适的话,可以在生成代码之后反汇编看下相应的指令是否如预想的那样。或者更简单的,段间转移嘛,依次将目标段址和偏移压栈,然后在 retf 试试了。
[解决办法]
jmp BASE : OFFSET
[解决办法]
不太明白你的 INIT_SETUP equ 09000h 是怎么来的
[解决办法]
同胞兄, 你用什麼debugger?
dos?
[解决办法]
要在masm软件里运行才行,其次调用debug执行