问题描述
- 汇编语言排序和RET返回问题
-
ORG 0000h
LJMP MAIN
ORG 0003h
MAIN:
MOV 30H,#02h
MOV 31H,#08h
MOV 32H,#06H
N EQU 03h
MOV r0,#30H
sort:
MOV A,r0
MOV r1,A
MOV r5,#N
CLR F0
DEC r5
MOV A,@r1
LOOP:
MOV r3,A
INC r1
MOV A,r1
CLR C
MOV A,@r1
SUBB A,r3
JNC LOOP1
SETB F0
MOV A,r3
XCH A,@r1
DEC r1
XCH A,@r1
INC r1
LOOP1:
MOV A,@r1
DJNZ r5,LOOP
JB F0,sort
RET
END
假设按递增顺序先排30H,31H,32H中的三个数,排完之后不是应该结束程序吗?为什么又返回sort了?
而且还有一个疑问:遇见RET是是返回子函数呢?还是返回主函数?为什么每次遇见RET都先返回子函数的第一条指令,再执行就回主函数,就是出不了程序了?
解决方案
不是加了个标号就是子程序了,必须是 PROC ... ENDP 才是子程序。
RET 必须对应 CALL。
你这段代码的结构莫名其妙,建议先看看《汇编语言》。
解决方案二:
http://blog.csdn.net/a123443/article/details/6779137
解决方案三:
http://www.cnblogs.com/Binhua-Liu/archive/2010/09/28/1837459.html
这是封装成函数的32bit汇编
解决方案四:
ret是用预先存在栈里的数值经行跳转,只要子程序里是堆栈平衡的就跳的回去。(看你的程序都没有push和pop,应该没这个问题)
ret需要的栈里的跳转地址是由call的时候存进去的(当然,你自己手动入栈也行),所以必须call过去的才能ret回来。
时间: 2024-09-28 17:09:27