Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 相对跳跃超出范围_Assembly - Fatal编程技术网

Assembly 相对跳跃超出范围

Assembly 相对跳跃超出范围,assembly,Assembly,我得到消息“(76)相对跳出范围000Eh字节”和(79)相对跳出范围0007h字节“每当我输入CMP八进制'3'时。我应该一直做到第七个八进制数,但当我尝试做第三个八进制数时,它总是给我一个错误。我只能做0,1和2,直到它给我一个错误。我不知道我该怎么办。我已经尽我所能尝试了我所学到的一切,但仍然没有得到任何结果。请帮帮我。我不熟悉组装P.S.我使用的是DOSBox 0.74 .Model small .data txt1 db "Octal to Binary Converter$" tx

我得到消息“(76)相对跳出范围000Eh字节”(79)相对跳出范围0007h字节“每当我输入CMP八进制'3'时。我应该一直做到第七个八进制数,但当我尝试做第三个八进制数时,它总是给我一个错误。我只能做0,1和2,直到它给我一个错误。我不知道我该怎么办。我已经尽我所能尝试了我所学到的一切,但仍然没有得到任何结果。请帮帮我。我不熟悉组装P.S.我使用的是DOSBox 0.74

.Model small

.data
txt1 db "Octal to Binary Converter$"
txt2 db "Enter an Octal Symbol: $"
title0 db "000$"
title1 db "001$"
title2 db "010$"
title3 db "011$"
title4 db "100$"
title5 db "101$"
title6 db "110$"
title7 db "111$"

mess db "Press ESC to exit...$"
invalid db "Input is invalid. Try again.$"
keypress db ?
octal db ?

.code
Start:
Mov AX, @data
Mov ds, ax

sys_st:
Mov AH, 6
Mov AL, 0
Mov BH, 15
Mov ch, 0
Mov cl, 0
Mov DH, 100
Mov DL , 100
Int 10H

Mov AH, 2
Mov BH, 0
Mov DL, 5
Mov DH, 5
Int 10H 

Mov AH, 9
Lea DX, txt1 
Int 21H

JMP sys_st2

sys_st2:
Mov AH, 2
Mov BH, 0
Mov DL, 5
Mov DH, 8
Int 10H 

Mov AH, 9
Lea DX, txt2 
Int 21H 

Mov AH, 1
Int 21H
Mov octal, AL 

CMP octal, '0'
JE sys_0

CMP octal, '1'
JE sys_1

CMP octal, '2'
JE sys_2

CMP octal, '3'
JE sys_3


CMP octal, '0'
JNE sys_invalid

CMP octal, '1'
JNE sys_invalid

CMP octal, '2'
JNE sys_invalid

CMP octal, '3'
JNE sys_invalid

sys_0:
Mov AH, 2
Mov BH, 0
Mov DL, 11
Mov DH, 11 
Int 10H

Mov AH, 9
Lea DX, title0 
Int 21H 

Mov AH, 2 
Mov BH, 0
Mov DL, 5
Mov DH, 15 
Int 10H 

JMP sys_exit

sys_1:
Mov AH, 2 
Mov BH, 0
Mov DL, 11
Mov DH, 11 
Int 10H 

Mov AH, 9
Lea DX, title1
Int 21H 

Mov AH, 2 
Mov BH, 0
Mov DL, 5
Mov DH, 15 
Int 10H 

JMP sys_exit

sys_2:
Mov AH, 2 
Mov BH, 0
Mov DL, 11
Mov DH, 11 
Int 10H 

Mov AH, 9
Lea DX, title2
Int 21H 

Mov AH, 2 
Mov BH, 0
Mov DL, 5
Mov DH, 15 
Int 10H 

JMP sys_exit

sys_3:
Mov AH, 2 
Mov BH, 0
Mov DL, 11
Mov DH, 11 
Int 10H 

Mov AH, 9
Lea DX, title3
Int 21H 

Mov AH, 2 
Mov BH, 0
Mov DL, 5
Mov DH, 15 
Int 10H 

JMP sys_exit

sys_invalid: 
Mov AH, 2 
Mov BH, 0
Mov DL, 5 
Mov DH, 11 
Int 10H 

Mov AH, 9
Lea DX, invalid 
Int 21H 

Mov AH, 1 
Int 21H 
JMP sys_st 

sys_exit: 

Mov AH, 2
Mov BH, 0
Mov DL, 5
Mov DH, 14
Int 10H 

Mov AH, 9
Lea DX, mess 
Int 21H 

Mov AH, 1 
Int 21H 
Mov keypress, AL 

CMP keypress, 27
JNE sys_exit 

JMP exit 

Exit: 
Mov AH, 4ch 
Int 21H 
End Start 

向文件中添加
.386
指令,以便能够使用80386引入的具有较大偏移量的相对跳转指令。或者,找到有问题的跳转,并将其替换为以下内容:

   jnz foo ; this jump is too long
取代

   jz bar ; opposite conditional
   jmp foo ; unconditional jumps can have larger offsets
bar:
   ...

向文件中添加
.386
指令,以便能够使用80386引入的具有较大偏移量的相对跳转指令。或者,找到有问题的跳转,并将其替换为以下内容:

   jnz foo ; this jump is too long
取代

   jz bar ; opposite conditional
   jmp foo ; unconditional jumps can have larger offsets
bar:
   ...

在16位代码中,相对跳转只能向前跳转127字节或-128字节。您可以分支到一个标签,然后跳转到要跳转到的标签。或者,您必须找到一种方法重新构造代码,使相对跳转更接近标签。可能重复的@MichaelPetch不正确。较长的相对跳转也可用,但您需要显式请求启用80386操作码。@FUZxxl:虽然没有这样标记,但我从生成的代码中假设他生成的是纯16位代码。我非常了解支持32位指令的
.386
(及相关)指令。但提供的代码是16位DOS,我假设OP可能希望使用16位。我不想弄脏水。@MichaelPetch这些不是32位指令,它们没有66h或67h前缀。长相对跳转当然可以在16位模式下正常工作,只是它们是由80386引入的。仅仅因为您的代码在16位模式下运行并不意味着您必须限制自己使用8086引入的操作码。相对跳转只能向前跳转127字节或16位代码中的-128字节。您可以分支到一个标签,然后跳转到要跳转到的标签。或者,您必须找到一种方法重新构造代码,使相对跳转更接近标签。可能重复的@MichaelPetch不正确。较长的相对跳转也可用,但您需要显式请求启用80386操作码。@FUZxxl:虽然没有这样标记,但我从生成的代码中假设他生成的是纯16位代码。我非常了解支持32位指令的
.386
(及相关)指令。但提供的代码是16位DOS,我假设OP可能希望使用16位。我不想弄脏水。@MichaelPetch这些不是32位指令,它们没有66h或67h前缀。长相对跳转当然可以在16位模式下正常工作,只是它们是由80386引入的。仅仅因为您的代码在16位模式下运行并不意味着您必须限制自己使用8086引入的操作码。第一部分假设操作码始终以实际硬件或启用386仿真的仿真器为目标(默认情况下DOSBox会这样做)。它不能在16位处理器286/8086/186等上工作。这只是您的一个假设。至于第二部分,在重复的问题中已经得到了更好的回答。@MichaelPetch Dosbox确实模拟了80386操作码。看,我在评论中提到了这一点。你可能没有马上看到它,因为我在原稿之后几秒钟就编辑了它。我还对它进行了扩展,提到了真实硬件。第一部分假设OP总是以真实硬件或启用386仿真的模拟器为目标(DOSBox默认设置为)。它不能在16位处理器286/8086/186等上工作。这只是您的一个假设。至于第二部分,在重复的问题中已经得到了更好的回答。@MichaelPetch Dosbox确实模拟了80386操作码。看,我在评论中提到了这一点。你可能没有马上看到它,因为我在原稿之后几秒钟就编辑了它。我还扩展了它,提到了真正的硬件。