在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
相关产品推荐
相关产品推荐

