You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在emu8086中正确使用far direct jmp的方法?跳转异常求助

问题解决:EMU8086跨段远直接跳转错误

问题根源

你遇到的问题是跨段远跳转的符号解析错误:在c1_s段中直接引用c2_s段的p2标签,但未告知汇编器该符号属于外部段,导致汇编器生成了错误的段地址,最终跳转到了c2_s的begin而非目标p2。

解决方案

需要解决跨段符号的可见性问题,同时修正硬编码段地址的错误:

  • 声明公共符号:在c2_s段中把p2标记为公共符号,允许其他段引用
  • 声明外部符号:在c1_s段中声明p2是外部远符号,让汇编器知道它属于其他段
  • 替换硬编码段地址:把addr中的硬编码0712h改为段名c1_s,让汇编器自动计算正确的段地址

修改后的完整代码

s_s segment stack "stack"
    dw 2
s_s ends 

d_s segment
    aa db 10  
    ab db 11
    addr dw p1, c1_s  ; 替换硬编码段地址为段名,自动计算正确值
d_s ends

c1_s segment
    assume cs:c1_s
    extrn p2:far  ; 声明p2为外部远符号
    
    p1:
    mov bl, ab 
    jmp far ptr p2
    
c1_s ends

c2_s segment
    assume ss:s_s, ds:d_s, cs:c2_s
    public p2  ; 将p2标记为公共符号,允许跨段引用
    
    begin:
    mov ax, d_s
    mov ds, ax
    mov al, aa

    jmp dword ptr addr
    
    p2:      
    mov ah,4ch                     
    int 21h 

c2_s ends 
end begin

为什么之前的写法无效?

你之前仅调整了跳转指令的语法,但未解决核心的跨段符号可见性问题。汇编器在c1_s段中无法获取p2的正确段信息,只能生成错误的跳转地址,恰好指向了c2_s的begin入口。另外,硬编码的0712h段地址大概率与EMU8086实际分配的段地址不匹配,会导致间接跳转的稳定性问题。

内容的提问来源于stack exchange,提问作者rufennec

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 07:15:34