设R0,R1分别存放着一个数据块的起始地址和结束地址,试编写一个汇编语言子程序,将该地址块内存清零

设R0,R1分别存放着一个数据块的起始地址和结束地址,试编写一个汇编语言子程序,将该地址块内存清零,第1张

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指令怎么用、汇编语言程序设计方法_汇编语言程序设计教程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10179935.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存