我已经制作了如下所示的汇编代码。 问题是,当我运行程序时,会出现一条错误消息:“相对跳出范围”。问题是循环的内容太长。有人可以帮助我并告诉我如何更改循环以使其有效吗?
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
答案 0 :(得分:3)
首先移动不必要的操作。例如,目前还不清楚你实际上要在这里完成什么,但是在一些情况下,你似乎重复using System.ComponentModel.DataAnnotations;
public bool IsValidEmail(string email)
{
return new EmailAddressAttribute().IsValid(email);
}
。尽管存在所有初始旋转,但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
实现的短跳转必须在循环指令的-128和+127字节之内