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

TASM 8086中出现“Near jump or call to different CS”错误求助

问题分析与修复方案

错误原因拆解

1. Symbol already different kind: SALIR

数据段中定义了名为salir的字符串变量:

salir db "Presione s para salir$"

同时代码段中又定义了同名的代码标签salir:,TASM不允许同一标识符既作为数据变量又作为代码标签,导致类型冲突错误。

2. Near jump or call to different CS

因为salir标识符先被解析为数据段的变量,jmp short salir尝试跳转到数据段的地址,而代码段(CS)和数据段(DS)是不同的段,short跳转属于近跳转,仅支持同一段内的地址偏移,因此触发跨段跳转错误。

修复后的完整代码

include macs.pbl

Pila Segment
Pila ends
Datos Segment
    var db 1
    var1 db 1
    igualesM DB "Los numeros son iguales$"
    MI1 db "Deme el primer numero$"
    MI2 db "Deme el segundo numero$"
    M1 db "El primero es mayor$"
    M2 db "El segundo es mayor$"
    ; 重命名数据段变量,避免与代码标签冲突
    salirMsg db "Presione s para salir$"
Datos ends

Codigo Segment
Assume cs:Codigo , ds:Datos

Inicio:
xor ax,ax
mov ax,datos
mov ds,ax

vuelta:
ImprimeM MI1

RecibirN
; 修正逻辑:将输入的第一个数存入var(假设RecibirN返回值在al中)
mov var, al

ImprimeM MI2
RecibirN
; 此时第二个数在al中,直接与var比较即可
cmp al, var
jz iguales
jns mayor1
js mayor2

iguales:
    ImprimeM igualesM
    jmp short salir

mayor2:
    ImprimeM M2  ; 原代码错误使用MI2,应该用M2提示"El segundo es mayor"
    jmp short salir

mayor1:
    ImprimeM M1  ; 原代码错误使用MI1,应该用M1提示"El primero es mayor"
    jmp short salir

salir:
    mov ah,4ch
    int 21h

Codigo ; 原代码用了Terminar,应该和Segment定义的名称一致
ends ;aqui termina el programa
    End inicio 

额外修复点说明

  • 原代码中mayor2和mayor1块里错误使用了输入提示MI1/MI2,应该改为结果提示M1/M2。
  • 原代码中mov ah,var逻辑错误,假设RecibirN宏将输入的数字存入al,应该把al的值存入var来保存第一个输入的数。
  • 代码段结束处的Terminar应该改为Codigo,与开头的Codigo Segment保持一致,避免段定义不匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:27:34