我已经编写了如下所示的程序集代码。问题是,当我运行程序时,会出现一条错误消息:“相对跳出范围”。问题是循环的内容太长。有人能帮助我并告诉我如何更改循环以使其正常工作吗?
IDEAL
MODEL small
STACK 100h
INCLUDE 'gvahim.mac'
DATASEG
; --------------------------
pos_dig_7 db 0
pos_div_7 db 0
print db 0
index db 0
ARR_DIV_7 db 100 dup(?)
ARR_DIGIT_7 db 100 dup(?)
; --------------------------
CODESEG
start:
mov ax, @data
mov ds, ax
; --------------------------
mov cx, 100
loop_1:
mov [print], 0
inc [index]
mov ax, 0
mov al, [index]
mov bl, 7
div bl
cmp ah, 0
jne jump1
mov [print], 1
mov bx, 0
mov bl, [pos_div_7]
mov bl, [index]
mov [ARR_DIV_7+bx], al
inc [pos_div_7]
jump1:
mov ax, 0
mov al, [index]
mov bl, 10
div bl
cmp al, 7
jne jump2
mov [print], 2
jump2:
cmp ah, 7
jne jump3
mov [print], 2
jump3:
mov [print], dl
cmp dl, 0
jne next1
mov ax, 0
mov al, [index]
jmp end_of_pro
next1:
cmp dl, 1
jne next2
mov ax, 77
next2:
cmp dl, 2
jne end_of_pro
mov bx, 0
mov bl, [pos_dig_7]
mov al, [index]
mov [ARR_DIGIT_7+bx], al
inc [pos_dig_7]
mov ax, 777
end_of_pro:
call PRINT_NUM_DEC
call NEW_LINE
loop loop_1
; --------------------------
exit:
mov ax, 4c00h
int 21h
INCLUDE 'gvahim.asm'
END start发布于 2017-01-21 11:14:14
首先,移动不必要的操作。例如,目前还不清楚您在这里到底想要完成什么,但乍一看,在许多情况下,您可能会重复使用mov [print], <value>。尽管有所有最初的波动,看来mov [print],dl总是会发生的。如果是这样的话,请删除其余的所有操作,这将至少从代码中删除四个多字节操作。
您还可以避免使用loop语句来解决这个问题。相反,自己检查计数器的值,然后使用jmp
dec cx
cmp cx, 0 ; Not actually needed - preceding line will set ZF at zero
jz finished
jmp loop1
finished:
<code continues>这允许近距离跳转,而不是短距离跳转,这正是loop正在有效使用的。loop实现的短跳必须在循环指令的-128和+127字节之内。
https://stackoverflow.com/questions/41778561
复制相似问题