读书人

关于jmp段间转移,该怎么解决

发布时间: 2013-01-23 10:44:49 作者: rapoo

关于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执行

读书人网 >汇编语言

热点推荐