+ -
当前位置:首页 → 问答吧 → 这条汇编指令该如何改写

这条汇编指令该如何改写

时间:2009-12-26

来源:互联网

jmpi go,INITSEG

要求是这样的,跳转到INITSEG段的go位置
上面的这条语句用intel 8086汇编编译器as86和连接器ld86可以通过

但是用nasm汇编工具却不能通过
现在想改写一下这条语句,让用nasm汇编工具能通过

我想显式指定转移的段地址和偏移地址

使用了以下方法,均不可靠
1)使用jmp far ptr opr指令,没有显式指定段地址,否定
:opr的段地址->CS
:opr的偏移地址->IP

2)使用JMP DWORD PTR OPR,可行,但是我需要先将数据存入内存,再取出,觉得不是好的解决方法

3)直接设置IP和CS的值,CS的值无法修改,否定

NASM中
1)指定段地址和段内偏移的汇编语句没有吗?就类似as86可以支持的"jmpi go,INITSEG"
2)没有高手可以解释下段见跳转的详细细节,如何确定将要跳转的段的段地址?

作者: tgy_2012   发布时间: 2009-12-26

直接写机器码试试:
DB 0EAH
DW go,INITSEG

作者: cnzdgs   发布时间: 2009-12-26

遇到一样的问题!!
我最后的代码是:
org 07c00h
Lable1:
mov ax,cs
mov ds,ax
mov ax,9000h
mov es,ax
mov si,0h
mov di,0h
mov cx,100h
cld
rep movsw
jmp 0x9000:(Lable2-Lable1)
Lable2:
mov ax,cs
mov ds,ax
mov es,ax
call dispstr
jmp $
dispstr:
mov ax,bootmessage
mov bp,ax
mov cx,16
mov ax,01301h
mov bx,000ch
mov dl,0
int 10h
ret
bootmessage: db "hello, os world!"
times 510-($-$$) db 0
dw 0xaa55
可以实现跳转,但是后面到9000::(Lable2-Lable1)所在的位置却不能正常执行后面的程序了。
也就是对于引导程序的将自己复制到别一个位置并从指定位置开始执行,在这里卡做了。
如果有会的PN,回一下吧,谢谢!!

作者: golly2009   发布时间: 2011-02-20