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

