首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

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

2013-01-23 
关于jmp段间转移在网上看了个代码,类似这样的jmp _go_init,INIT_SETUP我下载的nasm编译工具好像不支持jmpi

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

热点排行