首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >装配-相对跳出范围

装配-相对跳出范围
EN

Stack Overflow用户
提问于 2017-01-21 11:05:26
回答 1查看 1K关注 0票数 1

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

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2017-01-21 11:14:14

首先,移动不必要的操作。例如,目前还不清楚您在这里到底想要完成什么,但乍一看,在许多情况下,您可能会重复使用mov [print], <value>。尽管有所有最初的波动,看来mov [print],dl总是会发生的。如果是这样的话,请删除其余的所有操作,这将至少从代码中删除四个多字节操作。

您还可以避免使用loop语句来解决这个问题。相反,自己检查计数器的值,然后使用jmp

代码语言:javascript
复制
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字节之内。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41778561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档