寄存器冲突的问题

我们在子程序中使用的寄存器,很可能在主程序中也要使用,造成了寄存器使用上的冲突。解决的方法是,在子程序的开始将子程序中所有用到的寄存器中的内容都保存起来,在子程序返回前再恢复。可以用栈来保存寄存器中的内容。

以后,我们编写子程序的标准框架如下:

子程序开始:

      子程序中使用的寄存器入栈

      子程序内容

      子程序中使用的寄存器出栈

      返回(ret、retf)

示例:设计一个子程序,功能:将一个全是字母,以0结尾的字符串,转化成大写。

assume cs:code

data segment
         db     ‘word‘,0
         db     ‘unix‘,0
         db     ‘wind‘,0
         db     ‘good‘,0
data ends

code segment

start:
              mov ax,data
              mov ds,ax        mov bx,0

        mov cx,4s:        mov si,bx        call capital        add bx,5        loop s

        mov ax,4c00h        int 21h

capital:        push cx        push sichange:        mov cl,[si]        mov ch,0        jcxz ok        and byte ptr [si],11011111b        inc si        jmp short change

ok:        pop si        pop cx        ret  
code ends
end start

原文地址:https://www.cnblogs.com/gkp307/p/9928503.html

时间: 2024-10-05 05:04:48

寄存器冲突的问题的相关文章

自己总结:汇编寄存器冲突问题

寄存器冲突问题,解决方案: 在子程序的开始将子程序中所有用到的寄存器中的内容都保存起来,在子程序返回前再恢复.可以用栈来保存寄存器中的内容. 以后,我们编写子程序的标准框架如下: 子程序开始:子程序中使用的寄存器入栈 子程序内容 子程序中使用的寄存器出栈 返回(ret.retf) capital: push cx push si change: mov cl,[si] mov ch,0 jcxz ok and byte ptr [si],11011111b inc si jmp short ch

了解编译原理-笔记小结

这是之前学习编译原理过程中做下的笔记. 因能力有限,在很多地方都理解不到位,特别是对于词法分析与语法分析的过程感觉特别晦涩. 分享这个笔记也是为了自己做个总结,算是一个小的提纲吧,都没怎么深入解析编译的过程. 等以后领悟更多了再作补充吧. 希望各路人士能多加指点,谢谢. 词法分析 作用:将输入转换为一个一个的token,而其用一串整数来表示. 协作:只有当解析器需要的时候才会请求词法分析器,继续扫描输入流,在这个过程中将不断生成符号表. 实现:在通常的编程语言中,相对于不确定的有限自动机(NFA

CALL和RET指令

1.call和ret指令都是转移指令,它们都修改IP的值,或同时修改CS和IP的值.它们经常共同用语实现子程序的设计. 2.ret指令用栈中的数据,修改IP的内容,从而实现近转移. 3.retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移. 4.CPU执行ret指令时, (1)(IP)=((ss)*16+(sp)) (2)(sp)=(sp)+2 相当于进行:pop IP 执行retf指令时, (1)(IP)=((ss)*16+(sp)) (2)(sp)=(sp)+2 (3)(CS)=(

汇编语言---call和ret指令

汇编语言--call和ret指令 call和ret指令 call和ret指令都是转移指令,它们都修改IP,或同时修改CS和IP. 它们经常被共同用来实现子程序的设计. ret和retf ret指令用栈中的数据,修改IP的内容,从而实现近转移: retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移. CPU执行ret指令时,进行下面的两步操作: (1)(IP) = ((ss)*16 +(sp)) (2)(sp) = (sp)+2 CPU执行retf指令时,进行下面四步操作: (1)(IP

嵌入式Linux ARM汇编(七)——C语言与ARM汇编混合编程

嵌入式Linux ARM汇编(七)--C语言与ARM汇编混合编程 在嵌入式系统开发中,目前使用的主要编程语言是C和汇编.在大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较好,便于人的理解,而且有大量的支持库.但是很多地方还是要用到汇编语言,例如开机时硬件系统的初始化,包括CPU状态的设定,中断的使能,主频的设定,以及RAM的控制参数及初始化,一些中断处理方面也可能涉及汇编.另外一个使用汇编的地方就是一些对性能非常敏感的代码块,这是不能依靠C编译器的生成代

学习<<汇编语言 -王爽>>,自已完成的一道课程设计题 (5)

课程设计1 (材料详见书上211页) 题目描述: 以下是我解答的完整的代码: :>---------------------------------------------------------------------------------------- assume cs:codesg, ss:stacksg datasg segment db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983' db

汇编入门学习笔记 (九)—— call和ret

疯狂的暑假学习之  汇编入门学习笔记 (九)--  call和ret 參考: <汇编语言> 王爽 第10章 call和ret都是转移指令. 1. ret和retf ret指令:用栈中的数据,改动IP内容,从而实现近转移 相当于: pop ip retf指令:用栈中的数据.改动CS和IP,从而实现远转移 相当于: pop ip pop cs 样例:ret assume cs:code,ss:stack stack segment db 16 dup(1) stack ends code segm

ARM流水线关键技术分析与代码优化

引 言    流水线技术通 过多个功能部件并行工作来缩短程序执行时间,提高处理器核的效率和吞吐率,从而成为微处理器设计中最为重要的技术之一.ARM7处理器核使用了典型三级流 水线的冯·诺伊曼结构,ARM9系列则采用了基于五级流水线的哈佛结构.通过增加流水线级数简化了流水线各级的逻辑,进一步提高了处理器的性能. ARM7的三级流水线在执行单元完成了大量的工作,包括与操作数相关的寄存器和存储器读写操作.ALU操作以及相关器件之间的数据传输.执行单元的工作往 往占用多个时钟周期,从而成为系统性能的瓶颈

汇编语言 王爽第二版 总结

汇编语言 王爽第二版 总结,所以内容都是8086的 summary asssembly ,汇编总结 why: 最初始的编程语言就是使用打孔机,打出来的0 1 代码,然后把卡片插入到电脑中运行然后 看输出结果,这种纯01的二进制代码,编写困难调试困难运行结果的显示看着也很蛋疼,就像 一个简单的"hello world",11个字符,需要11×8个二进制,并且再进行输出,就更麻烦,因为 全部都是二进制,代码.为了更高效的开发程序,就出现了汇编语言,用来代替二进制代码的输入. what: 汇