当前位置: 技术问答>linux和unix
关于跳转指令的问题
来源: 互联网 发布时间:2015-06-06
本文导语: 程序具体意思是:将自身从0x7c0:0000复制到0x9000:0000处,然后跳转0x9000:go处继续运行,显示一个字母g。程序如下: .code16 .text .global _start _start: BOOTSEG=0x07C0 INITSEG=0x9000 movw $BOOTSEG, %ax movw %ax, %ds movw $INITSEG, %ax movw %ax, ...
程序具体意思是:将自身从0x7c0:0000复制到0x9000:0000处,然后跳转0x9000:go处继续运行,显示一个字母g。程序如下:
.code16
.text
.global _start
_start:
BOOTSEG=0x07C0
INITSEG=0x9000
movw $BOOTSEG, %ax
movw %ax, %ds
movw $INITSEG, %ax
movw %ax, %es
movw $256, %cx
subw %si, %si
subw %di, %di
cld
rep
movsw
yy:
ljmp $INITSEG,$go
go:
movb $0x67,%al
movb $0x0e,%ah
movb $0x07,%bl
int $0x10
putstrd:
jmp putstrd
.org 0x1fe
.word 0xaa55
在bochs下调试时,上段程序运行结果有误。把跳转指令改为ljmp $INITSEG-BOOTSEG,$go便可以正确运行,这是为什么,难道跳转时不是绝对地址跳转?还有标识go的偏移是0x19,将跳转指令改为ljmp $INITSEG-BOOTSEG,$0x19又无法正确显示结果,为什么。ljmp和jmpi有什么区别?望指教。
.code16
.text
.global _start
_start:
BOOTSEG=0x07C0
INITSEG=0x9000
movw $BOOTSEG, %ax
movw %ax, %ds
movw $INITSEG, %ax
movw %ax, %es
movw $256, %cx
subw %si, %si
subw %di, %di
cld
rep
movsw
yy:
ljmp $INITSEG,$go
go:
movb $0x67,%al
movb $0x0e,%ah
movb $0x07,%bl
int $0x10
putstrd:
jmp putstrd
.org 0x1fe
.word 0xaa55
在bochs下调试时,上段程序运行结果有误。把跳转指令改为ljmp $INITSEG-BOOTSEG,$go便可以正确运行,这是为什么,难道跳转时不是绝对地址跳转?还有标识go的偏移是0x19,将跳转指令改为ljmp $INITSEG-BOOTSEG,$0x19又无法正确显示结果,为什么。ljmp和jmpi有什么区别?望指教。
|
将程序转移到0x9000后,$go的地址也不是原来的地址了,所以...