装配 - 相对超出范围

时间:2017-01-21 11:05:27

标签: assembly x86-16

我已经制作了如下所示的汇编代码。 问题是,当我运行程序时,会出现一条错误消息:“相对跳出范围”。问题是循环的内容太长。有人可以帮助我并告诉我如何更改循环以使其有效吗?

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

1 个答案:

答案 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字节之内