《7.3 操作系统服务例程电子课件 计算机系统基础:C语言视角(RISC-V版).ppt》由会员分享,可在线阅读,更多相关《7.3 操作系统服务例程电子课件 计算机系统基础:C语言视角(RISC-V版).ppt(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、7.3 操作系统服务例程电子课件 计算机系统基础:C语言视角(RISC-V版)操作系统服务例程操作系统服务例程输入字符服务例程输入字符服务例程01 kbcr:.word 0 xFFFF0000#KBCR的内存映射地址的内存映射地址02 kbdr:.word 0 xFFFF0004#KBDR的内存映射地址的内存映射地址03#省略省略04#x10=12,输入字符服务例程,输入字符服务例程05 getc:addix2,x2,-4#x2,栈指针,栈指针06swx7,0(x2)#callee-save07lax5,kbcr 08 InPoll:lwx6,0(x5)#测试是否有字符被输入测试是否有字符被输
2、入09lwx7,0(x6)0Aandix6,x7,10Bbeqzx6,InPoll#如果如果KBCR0=0,轮询,轮询0C lax5,kbdr 0Dlwx6,0(x5)0Elwx11,0(x6)#将将KBDR中的数据加载到中的数据加载到x11中中070E行:采用轮询方式的输入字符指令序列行:采用轮询方式的输入字符指令序列x11中包含了从键盘输入的字符的中包含了从键盘输入的字符的ASCII码码0Fcsrrw x5,mepc,x010addix5,x5,411csrrw x0,mepc,x5#mepc-mepc+412lwx7,0(x2)#恢复寄存器恢复寄存器13addix2,x2,414lwx6
3、,0(x2)15addix2,x2,416lwx5,0(x2)17addix2,x2,418mret#从自陷返回从自陷返回0F11行:行:mepc mepc+418行:从自陷返回行:从自陷返回注意:从键盘输入的字符并不会显示在显示器上注意:从键盘输入的字符并不会显示在显示器上寄存器保存寄存器保存/恢复恢复0506行,行,1217行行采用采用callee-save(被调用者保存)策略的寄存器(被调用者保存)策略的寄存器保存和恢复保存和恢复寄存器寄存器x5,x6和和x7的值被修改,需要保存和恢复的值被修改,需要保存和恢复注意:在自陷处理例程开头,已经将注意:在自陷处理例程开头,已经将x5和和x6的
4、值的值压栈保存,在此服务例程中,只需要将压栈保存,在此服务例程中,只需要将x7的值压的值压栈即可栈即可输出字符服务例程输出字符服务例程01 dcr:.word 0 xFFFF0008#DCR的内存映射地址的内存映射地址02 ddr:.word 0 xFFFF000C#DDR的内存映射地址的内存映射地址03#省略省略04#x10=11,输出字符服务例程,输出字符服务例程05 putc:addix2,x2,-4#x2,栈指针,栈指针06swx7,0(x2)#callee-save07lax5,dcr 08 OutPoll:lwx6,0(x5)#测试显示是否就绪测试显示是否就绪09lwx7,0(x6
5、)0Aandix6,x7,10Bbeqzx6,OutPoll#如果如果DCR0=0,轮询,轮询0C lax5,ddr 0Dlwx6,0(x5)0Eswx11,0(x6)#将将x11中的数据写到中的数据写到DDR中中0Fcsrrw x5,mepc,x010addix5,x5,411csrrw x0,mepc,x5#mepc-mepc+412lwx7,0(x2)#恢复寄存器恢复寄存器13addix2,x2,414lwx6,0(x2)15addix2,x2,416lwx5,0(x2)17addix2,x2,418mret#从自陷返回从自陷返回输出字符串服务例程输出字符串服务例程系统调用号:系统调用号
6、:x10=4,要输出的字符串起始地址位,要输出的字符串起始地址位于于x11中中标志控制的循环:遇到了字符标志控制的循环:遇到了字符x00输出字符串服务例程输出字符串服务例程01 puts:addix2,x2,-4#x2,栈指针,栈指针02swx7,0(x2)#callee-save03addix2,x2,-4 04swx8,0(x2)05addix2,x2,-4 06swx11,0(x2)07#对字符串中的每一个字符进行循环对字符串中的每一个字符进行循环08 loop:lbx8,0(x11)#取得下一个字符取得下一个字符09 beqzx8,Return#如果是如果是0,字符串结束,字符串结束0
7、A#轮询输出轮询输出0Blax5,dcr 0C OutPoll:lwx6,0(x5)#测试显示是否就绪测试显示是否就绪0Dlwx7,0(x6)0Eandix6,x7,10Fbeqzx6,OutPoll#如果如果DCR0=0,轮询,轮询10 lax5,ddr 11lwx6,0(x5)12swx8,0(x6)#将将x8中的数据写到中的数据写到DDR中中13addir11,r11,1#指针加指针加114jloop0B12行:采用轮询方式的输出字符指令序列行:采用轮询方式的输出字符指令序列13行行:每输出一个字符,每输出一个字符,x11中的值加中的值加1,指向下一个单元,指向下一个单元15#从自陷返回
8、从自陷返回16 Return:csrrwx5,mepc,x017addix5,x5,418csrrw x0,mepc,x5#mepc-mepc+419lwx11,0(x2)#恢复寄存器恢复寄存器1Aaddix2,x2,41Blwx8,0(x2)1Caddix2,x2,41Dlwx7,0(x2)1Eaddix2,x2,41Flwx6,0(x2)20addix2,x2,421lwx5,0(x2)22addix2,x2,423 mret注意:当字符串输出结束,注意:当字符串输出结束,x11的值指向字符串的值指向字符串末尾的末尾的x00使用使用callee-save(被调用者保存)策略(被调用者保存)
9、策略0506行,行,191A行:将寄存器行:将寄存器x11进行保存和恢复进行保存和恢复返回到调用程序后,返回到调用程序后,x11仍然指向字符串开头仍然指向字符串开头输入字符串服务例程输入字符串服务例程系统调用号:系统调用号:x10=8输入的字符串以换行符结束输入的字符串以换行符结束存储空间起始地址位于存储空间起始地址位于x11中,存储空间的大小位中,存储空间的大小位于于x12中中服务例程的返回值是实际存储的字符串的长度(在服务例程的返回值是实际存储的字符串的长度(在x10中)中)注:换行符被存储到字符串末尾注:换行符被存储到字符串末尾输入字符串服务例程输入字符串服务例程标志控制的循环:遇到了换
10、行符,或存储空间已满标志控制的循环:遇到了换行符,或存储空间已满输入字符串服务例程输入字符串服务例程01 gets:addix2,x2,-4#x2,栈指针,栈指针02swx7,0(x2)#callee-save03addix2,x2,-404swx8,0(x2)05addix2,x2,-406swx11,0(x2)07#是否遇到换行,或存储空间已满是否遇到换行,或存储空间已满08addix10,x0,0#x10,返回的字符串长度,返回的字符串长度09addix8,x0,0#x8,输入的字符,输入的字符0Aloop:beqx10,x12,Return#x10=x12|x8=n0Baddix7,x
11、0,100Cbeqx8,x7,Return0D#轮询输入字符轮询输入字符0Elax5,kbcr 0FInPoll:lwx6,0(x5)#测试是否有字符被输入测试是否有字符被输入10lwx7,0(x6)11andix6,x7,112beqzx6,InPoll#如果如果KBCR0=0,轮询,轮询13 lax5,kbdr 14lwx6,0(x5)15lwx8,0(x6)#将将KBDR中的数据加载到中的数据加载到x8中中0E15行:采用轮询方式的输入字符指令序列行:采用轮询方式的输入字符指令序列16#存储字符,为下一个做准备存储字符,为下一个做准备17sbx8,0(x11)18addix11,x11,
12、119addix10,x10,11Ajloop1B#从自陷返回从自陷返回1CReturn:csrrw x5,mepc,x01Daddix5,x5,41Ecsrrw x0,mepc,x5#mepc-mepc+41Flwx11,0(x2)#寄存器恢复寄存器恢复20addix2,x2,421lwx8,0(x2)22addix2,x2,423lwx7,0(x2)24addix2,x2,425lwx6,0(x2)26addix2,x2,427lwx5,0(x2)28addix2,x2,429mret#从自陷返回从自陷返回注意:当字符串输入结束,注意:当字符串输入结束,x11的值指向字符串末尾的值指向字符
13、串末尾使用使用callee-save(被调用者保存)策略(被调用者保存)策略0506行,行,1F20行:将寄存器行:将寄存器x11进行保存和恢复进行保存和恢复返回到调用程序后,返回到调用程序后,x11仍然指向字符串开头仍然指向字符串开头寄存器的保存寄存器的保存/恢复恢复一个寄存器的值一个寄存器的值,在该寄存器被存储了其他值之后在该寄存器被存储了其他值之后再次用到再次用到在在使用使用之前之前,将其保存将其保存再次使用之前再次使用之前,将其恢复将其恢复采用调用者采用调用者/被调用者保存被调用者保存策略策略的原则的原则哪个程序知道哪些寄存器将被接下来的操作所破坏,哪个程序知道哪些寄存器将被接下来的操作所破坏,处理保存处理保存/恢复问题的就是哪一个程序恢复问题的就是哪一个程序用户程序员不知道操作系统服务例程使用了哪些寄存器在操作系统服务例程中,采用callee-save(被调用者保存)策略,将使用的寄存器进行保存和恢复注意,用于返回值的寄存器不可保存/恢复