小弟编写汇编语言时遇到jump out of range by 13 byte,求教!

「已注销」 2016-06-12 08:09:07

j各位大神,求解决!
...全文
2015 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-08-22
  • 打赏
  • 举报
回复
《The Intel 64 and IA-32 Architectures Software Developer's Manual》
baidu_23107797 2016-06-12
  • 打赏
  • 举报
回复
也可以把 JE SOFTDLY 改成 JNE $ + 3 JMP SOFTDLY
zara 2016-06-12
  • 打赏
  • 举报
回复
上面的 l_1: 应该是 l_1?:
zara 2016-06-12
  • 打赏
  • 举报
回复
最简单的就是换用 Masm6 甚至 Masm32 的编译器,会自动进行变换,或使用 386 级条件转移指令(可转范围为前后 64K 而非这个的 256)。
如果确实要自己修改,就是把 JE SOFTDLY 改为
jne  l_1?  ; 到 l_1?: 很短不会出问题
jmp SOFEDLY ; jmp 指令可寻址前后共 64K 范围,一般也不会越界
l_1: ; 新增的标号
CMP AL, 31H ; 这是你原来的后续指令
「已注销」 2016-06-12
  • 打赏
  • 举报
回复
之前看一些帖子说,用jnz再加一个跳转就行,但是不太理解,也不会···
「已注销」 2016-06-12
  • 打赏
  • 举报
回复
STACK SEGMENT PARA STACK'STACK' DB 100 DUP(0) STACK ENDS DATA SEGMENT IOPORT EQU 0C400H-0280H IO8255A EQU IOPORT+288H IO8255C EQU IOPORT+28AH IO8255B EQU IOPORT+28BH IO8253A EQU IOPORT+280H IO8253B EQU IOPORT+283H IO0832A EQU IOPORT+290H PROT EQU 0C400H-280H PROTH EQU PROT+298H PROTLR EQU PROT+2A0H PROTLY EQU PROT+2A8H DATA1 DB 80H,96H,0AEH,0C5H,0D8H,0E9H,0F5H,0FDH DB 0FFH,0FDH,0F5H,0E9H,0D8H,0C5H,0AEH,96H DB 80H,66H,4EH,38H,25H,15H,09H,04H DB 00H,04H,09H,15H,25H,38H,4EH,66H ;正弦波数据 LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH MESG1 DB 0DH,0AH,'INPUT A NUM (1--8=PLAY PIANO,9=PLAY MUSIC,ESC=EXIT):',0DH,0AH,'$' MESG2 DB 0DH,0AH,'PLEASE CHOOSE THE MUSIC YOU LIKE(1-AAA,2-BBB) :',0DH,0AH,'$' TIME DB 120,110,100,90,81,72,55,42 ;发不同音时8253的计数器初值 NUM DB ? ;NUM为8253计数器初值的序号-- MESS DB 'STRIKE ANY KEY,RETURN TO DOS!',0AH,0DH,'$' MIN1 DB 00H,01H,02H,03H,04H,05H,06H,07H COUNT DB 0 JNUM DB ? ;JNUM用来存储输入数字 MUSIC DB 30H,31H,31H,35H,35H,36H,36H,35H,30H,30H,34H,34H,33H,33H,32H,32H,31H,100 DUP(30H);,35H,35H,34H,34H,33H,33H,32H,35H,35H,34H,34H,33H,33H,32H,31H,31H,35H,35H,36H,36H,35H,34H,34H,33H,33H,3;2H,32H,31H, QMUSIC DB ? DOWN DB 31H,32H,33H,34H,35H,36H,37H,38H,38H,37H,36H,35H,34H,33H,32H,31H,100 DUP(30H) PP DB ? TT DB ? LMUSIC EQU 45 BUFF1 DB 00H,00H,18H,3CH,3CH,18H,00H,00H BUFF2 DB 00H,1EH,0AH,46H,62H,50H,78H,00H BUFF3 DB 00H,06H,06H,60H,60H,06H,06H,00H BUFF4 DB 24H,66H,0E7H,00H,00H,0E7H,66H,24H BUFF5 DB 42H,0E7H,42H,18H,18H,42H,0E7H,42H BUFF6 DB 66H,24H,81H,0C3H,0C3H,81H,24H,66H BUFF7 DB 24H,66H,00H,0DBH,0DBH,00H,66H,24H BUFF8 DB 0CBH,99H,10H,0C6H,63H,08H,99H,0D3H DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV TT,1 MOV AX,DATA MOV DS,AX MOV DX,IO8255B ;使8255的A口为输出方式 MOV AX,92H OUT DX,AL MOV QMUSIC,0 JMP SSS ZERO: MOV QMUSIC,0 SSS: CMP QMUSIC,LMUSIC JE ZERO CMP QMUSIC,0 JE SSS4 JMP SSS3 SSS4: MOV DX,OFFSET MESG1 MOV AH,9 INT 21H ;显示提示信息 MOV AH,7 INT 21H ;从键盘接收字符,不回显 SSS3: CMP AL,39H JE PLAY0 CMP QMUSIC,0 JE OO JMP PLAY OO: CMP AL,1BH JE EXIT ;若为ESC键,则转EXIT CMP AL,30H JE SOFTDLY ;MOV DI ,OFFESET RECORD ; MOV [DI] ,AL ; INC DI CMP AL,31H JL SSS CMP AL,38H JG SSS ;若不在'1'-'8'之间转SSS MOV JNUM,AL SUB AL,31H MOV NUM,AL ;求出相应的时间常数的序号 MOV CX,60 ;取60次32个正弦波数据 SSS2: MOV AL,JNUM SUB AL,30H ;将所得字符的ASCII码减30H MOV BX,OFFSET LED ;BX为数码表的起始地址 XLAT ;求出相应的段码 MOV DX,IO8255C ;从8255的C口输出 OUT DX,AL DDD: MOV SI,0 LLL: MOV AL,DATA1[SI] ;取正弦波数据 MOV DX,IO0832A OUT DX,AL ;放音 CALL DELAY ;调延时子程序 INC SI CMP SI,32 ;是否取完32个数据 JL LLL ;若没有,则继续 LOOP DDD ;总循环次数60是否完,没有,则继续 MOV CX,0002H CALL NIAN ;------------------------ CALL NIAN ;CALL NIAN JMP SSS ;转SSS EXIT: MOV AH,4CH INT 21H PLAY0: CMP TT,1 JE TT1 MOV DX,OFFSET MESG2 MOV AH,9 INT 21H ;显示子菜单 MOV AH,7 INT 21H ;输入子菜单命令 MOV PP,AL PLAY: MOV AL,QMUSIC CMP PP,32H JE PLAY2 CMP PP,31H JNE PLAY0 MOV BX,OFFSET MUSIC PLAY3: XLAT MOV CL,QMUSIC ADD CL,01H MOV QMUSIC,CL JMP OO TT1: MOV TT,0 MOV PP,32H PLAY2: MOV BX,OFFSET DOWN JMP PLAY3 SOFTDLY: MOV BL,10 DELAY4: MOV CX ,0FFFFH WAIT3: LOOP WAIT3 DEC BL JNZ DELAY4 JMP SSS DELAY PROC NEAR ;延时子程序 CCC1: MOV BX,OFFSET TIME MOV DX,IO8253B ;置8253通道0为方式0工作 MOV AL,10H OUT DX,AL MOV AL,NUM ;取相应的时间常数 XLAT MOV DX,IO8253A OUT DX,AL ;向8253通道0输出 KKK: MOV DX,IO8255A IN AL,DX ;从8255A口读一字节 TEST AL,01 ;判PA0口是否为1 JZ KKK ;若不为1,则转KKK RET ;子程序返回 DELAY ENDP NIAN PROC NEAR START2: MOV AX,DATA MOV DS,AX MOV DX,OFFSET MESS AGN: MOV CX,80H D2: MOV SI,OFFSET MIN1 MOV AH,01H PUSH CX MOV CX,0008H NEXT: MOV AL,JNUM CALL BUFF MOV DX,PROTH OUT DX,AL MOV AL,AH MOV DX,PROTLR OUT DX,AL ;显示第一行红 SHL AH,01 INC SI PUSH CX MOV CX,0FFFFH DELAY2: LOOP DELAY2 ;延时 POP CX LOOP NEXT POP CX CALL DELAY LOOP D2 MOV AL,00 MOV DX,PROTLR OUT DX,AL CMP QMUSIC,0 JE C1 RET C1: MOV AH,01 INT 16H JNZ BACK AGN1: MOV CX,80H ;AGN1为显示黄色 D1: MOV SI,OFFSET MIN1 MOV AH,01 PUSH CX MOV CX,0008H NEXT1: MOV AL,JNUM CALL BUFF MOV DX,PROTH OUT DX,AL MOV AL,AH MOV DX,PROTLY OUT DX,AL SHL AH,01 INC SI PUSH CX MOV CX,0FFFFH DELAY1: LOOP DELAY1 MOV CX,0FFFFH DELAY3: LOOP DELAY3 POP CX LOOP NEXT1 POP CX CALL DELAY LOOP D1 MOV AL,00 MOV DX,PROTLY OUT DX,AL CMP QMUSIC,0 JE C2 RET C2: MOV AH,01 INT 16H JNZ BACK JMP AGN BACK: RET ;---------------------------------------------------------------- DELAY0 PROC NEAR ;延迟子程序 PUSH CX MOV CX,0FFFFH CCC: LOOP CCC POP CX RET DELAY0 ENDP ;--------------------------------------------------------------------- ;-------------------------------------------------------------------- BUFF PROC NEAR ; 代码选择判断子程序 JUDGE1: CMP AL,31H JE L1 CMP AL,32H JE L2 CMP AL,33H JE L3 CMP AL,34H JE L4 CMP AL,35H JE L5 CMP AL,36H JE L6 CMP AL,37H JE L7 CMP AL,38H JE L8 ;JMP A2 L1: MOV AL,[SI] MOV BX,OFFSET BUFF1 XLAT RET ;得到第一行码 L2: MOV AL,[SI] MOV BX,OFFSET BUFF2 XLAT RET L3: MOV AL,[SI] MOV BX,OFFSET BUFF3 XLAT RET L4: MOV AL,[SI] MOV BX,OFFSET BUFF4 XLAT RET L5: MOV AL,[SI] MOV BX,OFFSET BUFF5 XLAT RET L6: MOV AL,[SI] MOV BX,OFFSET BUFF6 XLAT RET L7: MOV AL,[SI] MOV BX,OFFSET BUFF7 XLAT RET L8: MOV AL,[SI] MOV BX,OFFSET BUFF8 XLAT RET BUFF ENDP NIAN ENDP CODE ENDS END START
「已注销」 2016-06-12
  • 打赏
  • 举报
回复

是这个吗?
baidu_23107797 2016-06-12
  • 打赏
  • 举报
回复
Error在74行,若图上没有其他东西,估计位置未必是附图附近吧

21,453

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧