早教吧 育儿知识 作业答案 考试题库 百科 知识分享

汇编语言编译时提示outofrange错误DATASEGMENTBUF1DW5DUP(?)BUF2DW5DUP(?)MYDATADB1,2,20,4,5,3,4,40,5,20,5,6,60,6,20,1,2,20,4,20,2,3,10,5,15DATAENDSSTACKSEGMENTSTACKDW5DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKS

题目详情
汇编语言编译时提示out of range错误
DATA SEGMENT
BUF1 DW 5 DUP(?)
BUF2 DW 5 DUP(?)
MYDATA DB 1,2,20,4,5,3,4,40,5,20,5,6,60,6,20,1,2,20,4,20,2,3,10,5,15
DATA ENDS
STACK SEGMENT STACK
DW 5 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
LEA SI,BUF1
LEA DI,BUF2
LEA BX,MYDATA
MOV CX,5
AGAIN:XOR AX,AX
MOV AL,[BX]
INC BX
MOV DL,[BX]
INC BX
IMUL DL
PUSH AX
MOV AL,[BX]
INC BX
CBW
MOV DL,[BX]
INC BX
IDIV DL
CBW
PUSH AX
MOV AL,[BX]
INC BX
CBW
XOR DX,DX
SUB DX,AX
POP AX
ADD DX,AX
POP AX
ADD DX,AX
JS IFNE
MOV [SI],DX
MOV AX,[SI]
MOV DL,10
IDIV DL
MOV DL,AL
ADD DL,30H
MOV AH,02H
INT 21H
MOV AX,[SI]
MOV DL,10
IDIV DL
MOV DL,AH
ADD DL,30H
MOV AH,02H
INT 21H
JMP OVER
IFNE:MOV [DI],DX
MOV DL,'-'
MOV AH,02H
INT 21H
MOV AX,[DI]
XOR AX,0FFH
INC AX
MOV DL,10
IDIV DL
MOV DL,AL
ADD DL,30H
MOV AH,02H
INT 21H
MOV AX,[DI]
XOR AX,0FFH
INC AX
MOV DL,10
IDIV DL
MOV DL,AH
ADD DL,30H
MOV AH,02H
INT 21H
OVER:MOV DL,0AH
MOV AH,02H
INT 21H
MOV DL,0DH
MOV AH,02H
INT 21H
INC SI
INC DI
LOOP AGAIN
MOV AH,4CH
INT 21H
CODE ENDS
END START
这是我写的代码,编译时提示out of range by 7 bytes错误,提示错误发生在倒数第五行,就是LOOP错误,什么原因,关键是有什么办法修改吗,
▼优质解答
答案和解析
你看书上的指令系统里面是这么介绍的,LOOP rel,这个rel是8位补码数表示的偏移地址,8位补码数的表数范围为-128~127,即LOOP指令的目的地址应该在 当前地址-128~当前地址+127 之间,也就是说LOOP指令可以往前跳128个字节或是往后跳127个字节.
很明显,你的目的地址AGAIN在LOOP之前,而且这个距离超过了128个字节,这个字节数是指的指令编译后生成的二进制代码的长度,比如说XOR AX,AX占1个字节,INC BX占一个字节,MOV DL,10占两个字节,具体的你自己推算.
那么碰到这样子的情况要怎么处理?一是优化程序,精简指令代码,看你的错误提示是多超出了7个字节,应该是可以想办法减少的.另外就是中转了,用LOOP跳不过去,那我可以先用LOOP跳到一个较近的地方,在用JMP指令跳转,JMP指令的跳转范围是64K,毫无压力的,程序后几行改成如下试试:
INC SI
INC DI
LOOP AGAIN11
MOV AH,4CH
INT 21H
AGAIN11:JMP AGAIN
CODE ENDS
END START