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