mov a,#0
loop: mov @r0,a
inc r0
cjne r0,r1,loop
ret
ret用栈的数据修改IP的内容,实现近转移。
ret执行步骤:
(1):(IP)=((SS)16+SP)
(2):(SP)=(SP)+2
执行过程
ret指令用栈中的数据,修改IP的值,从而实现近转移。
CPU执行ret指令时,进行下面两步 *** 作:
(IP)=((SS)16+(SP))
(SP)=(SP)+2;
另一种用法ret n(n为整数)
等效于
(IP)=((SS)16+(SP))
(SP)=(SP)+2;
(SP)=(SP)+n;
例如ret 4
pop ip
add sp,4
返回调用处
例:
push eax
call msg;call标号是把eip压入堆栈,然后再跳到标号msg处;[标记1]
;继续代码
msg:
push 0
push 0
push eax
push 0
call dword ptr[MessageBoxA]
ret;这是取出EIP,返回到调用处,继续执行[标记1]
扩展资料:
功能:
从堆栈中退出pc的高8位和低8位字节,把堆栈指针减2,从pc值处开始继续执行程序。不影响任何标志。
例子
;主程序
MAIN:SETB P10;(1)开始主程序,P10口置1(P10口输出为高,可以控制LED点亮)
LCALL DELAY;(2)此时当前堆栈指针加2,调用(6)DELAY延时子程序
CLR P10;(3)P10口清零(P10口输出为低,可以控制LED熄灭)
LCALL DELAY;(4)此时当前堆栈指针加2,调用(6)DELAY延时子程序
LJMP MAIN;(5)跳转到主程序,这样LED实现循环点亮
;子程序
DELAY:MOV R7,#250;(6)250-->R7
D1:MOV R6,#250;(7)250--->R6
D2:DJNZ R6,D2;(8)(R6-1),等于零执行下一条,不等于零,则跳转到D2
DJNZ R7,D1;(9)(R7-1),等于零执行下一条,不等于零,则跳转到D1
RET;(10)当前堆栈指针减2,返回到(3)CLR P10继续执行MAIN主程序。
END(11)程序结束(伪指令)
参考资料:
百度百科——RET指令
百度百科——ret
编码不容易,望能帮到楼主。楼主好好看
CRLFMACRO;宏定义,实现回车换行
MOVAH,2
MOVDL,0DH
INT21H
MOVAH,2
MOVDL,0AH
INT21H
ENDM
DSEGMENT
SCOREDB76,69,84,90,73,88,89,63,100,80;数组接收分数
SDB5DUP();预留5个位置存储每个分数段的人数
WORDSDB"THENUMBERBETWEEN60~69IS:$"
WORDS1DB"THENUMBERBETWEEN70~79IS:$"
WORDS2DB"THENUMBERBETWEEN80~89IS:$"
WORDS3DB"THENUMBERBETWEEN90~99IS:$"
WORDS4DB"THENUMBERBETWEEN100IS:$"
DENDS
CODESEGMENT
ASSUMECS:CODE,DS:D
BG:
MOVAX,D
MOVDS,AX
CALLCOUNT;调用子程序
MOVAH,9;输出每个分数段的人数
LEADX,WORDS
INT21H
MOVAH,2
MOVDL,S
ADDDL,30H
INT21H
CRLF
MOVAH,9
LEADX,WORDS1
INT21H
MOVAH,2
MOVDL,S1
ADDDL,30H
INT21H
CRLF
MOVAH,9
LEADX,WORDS2
INT21H
MOVAH,2
MOVDL,S2
ADDDL,30H
INT21H
CRLF
MOVAH,9
LEADX,WORDS3
INT21H
MOVAH,2
MOVDL,S3
ADDDL,30H
INT21H
CRLF
MOVAH,9
LEADX,WORDS4
INT21H
MOVAH,2
MOVDL,S4
ADDDL,30H
INT21H
CRLF
MOVAH,4CH
INT21H
COUNT:;子程序入口
MOVCX,10;循环10次
MOVSI,0
LOP:
INT3
MOVAL,SCORE[SI]
CMPAL,70
JBNUMBER6;比较进入不同的标号进行计算每个分数段人数
CMPAL,80
JBNUMBER7
CMPAL,90
JBNUMBER8
CMPAL,100
JENUMBER10
JMPNUMBER9
NUMBER6:;不同标号之下的作用是计算每个分数段人数并存于预留的位置中
MOVBL,S
INCBL
MOVS,BL
JMPL
NUMBER7:
MOVBL,S1
INCBL
MOVS1,BL
JMPL
NUMBER8:
MOVBL,S2
INCBL
MOVS2,BL
JMPL
NUMBER9:
MOVBL,S3
INCBL
MOVS3,BL
JMPL
NUMBER10:
MOVBL,S4
INCBL
MOVS4,BL
JMPL
L:
INCSI
LOOPLOP
RET;子程序结束,放回主程序
CODEENDS
ENDBG
以上就是关于设R0,R1分别存放着一个数据块的起始地址和结束地址,试编写一个汇编语言子程序,将该地址块内存清零全部的内容,包括:设R0,R1分别存放着一个数据块的起始地址和结束地址,试编写一个汇编语言子程序,将该地址块内存清零、汇编ret指令怎么用、汇编语言程序设计方法_汇编语言程序设计教程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)