请教大家一个关于地址转移的问题,捆饶了我N多天了,强烈要求高手解决

时间:2022-10-23 00:08:33
我的这个程序是想把输入的几个数字以十进制的形式存放到相应的W,X,Y中,而且输入的时候格式是***,***,***$以$做结尾,为此写了个宏ATD,但是在前面有个地址转移超过了128字节,不知道该怎么转移到相应的地址,代码如下:
ATD   MACRO   A,B
   MOV   AX,0
   MOV   CH,100
   MOV   CL,10
   SUB   BYTE PTR [A],30H
   MOV   AL,[A]
   MUL   CH
   MOV   DX,AX
   INC   A
   MOV   AL,[A]
   SUB   AL,30H
   MUL   CL
   ADD   DX,AX
   INC   A
   MOV   AL,[A]   
   SUB   AL,30H
   ADD   DX,AX   
   MOV   B,DL
   ENDM
STACK   SEGMENT   STACK
   DB 200 DUP(0)
STACK   ENDS
DATA   SEGMENT
A   DB 21
   DB ?
   DB 21 DUP('0')
B   DB 21 DUP('0')
W   DB   ?
X   DB   ?
Y   DB   ?
R   DB   ?
Z   DD   ?
BUF   DB 'PLEASE INPUT THE VALUE OF W,X,Y FOR Z=((W-X)/10*Y)',0DH,0AH,'$'
DATA   ENDS
CODE   SEGMENT
   ASSUME   CS:CODE,DS:DATA,SS:STACK
BEGIN:
   MOV   AX,DATA
   MOV   DS,AX
   LEA   DX,BUF
   MOV   AH,09H
   INT   21H
   LEA   DX,A
   MOV   AH,0AH
   INT   21H
   LEA   BP,B
   MOV   CH,0
   MOV   CL,A+1
   LEA   BX,A+2
   MOV   DI,-1
;--------------------------------------------------------------------   
OSCAN:   INC   DI
   MOV   SI,DI
   CMP   BYTE PTR [BX+SI],24H
   JE   EXIT              ;就是这里转移地址的时候有问题
;--------------------------------------------------------------------
ISCAN:   MOV   DI,SI
   CMP   BYTE PTR [BX+DI],2CH
   JE   OSCAN
   MOV   AL,BYTE PTR [BX+DI]
   MOV   DS:[BP],AL
   INC   BP
   JMP   ISCAN
   LEA   BX,B
   ATD   BX,W
   ATD   BX,X
   ATD   BX,Y
EXIT:   MOV   AH,4CH
   INT   21H
CODE   ENDS
   END   BEGIN

2 个解决方案

#1


首先, 你的这个代码中 JE EXIT 没有超出 128 的范围吧; 其次, 如果有超出的话, 可以在程序的开始加上下面的两个语句, 使编译程序可以使用 386 级的代码, 即条件专业也可以是 Near 范围的 [-32k, 32k): 
.386
option segment:use16  ; 也可以在 .386 语句之前用 .model 语句说明内存模式 (非 flat)

#2


jne next
jmp exit
next:
.....
.....

#1


首先, 你的这个代码中 JE EXIT 没有超出 128 的范围吧; 其次, 如果有超出的话, 可以在程序的开始加上下面的两个语句, 使编译程序可以使用 386 级的代码, 即条件专业也可以是 Near 范围的 [-32k, 32k): 
.386
option segment:use16  ; 也可以在 .386 语句之前用 .model 语句说明内存模式 (非 flat)

#2


jne next
jmp exit
next:
.....
.....