先由一个题目引发我对指针一类的思考:
1. 以下为C代码:
int exchange( int *xp, int y){
int x = *xp
*xp = y;
return x;
}
2. 以下为C代码对应的汇编代码(该汇编代码基于:xp和y存储在相对于寄存器% ebp 中地址值偏移8和12的位置):
movl 8(% ebp),% edx
movl (% edx), % eax
movl 12(% ebp),% ecx
movl % ecx,(% edx)
代码剖析: 这是一个数据交换函数,首先看C代码:
(参数xp是一个指向整数的指针,而y则是一个整数。)
我们可以通过具体的例子帮助理解这个代码: int a = 4; int b = exchange(&a,3);
int x = *xp; //读取存储在xp所指位置中的值,并将它存放到名为x的局部变量中。
(这个时候,x = a= 4;)
*xp = y; //将参数y的值写到xp所指的位置,。
(那么,xp则指向值为y(即3)的位置,当然这个xp代表的是变量a的指向,所以a的值变为3)
return x; //x的值已经变为4;
最终结果为: a=3,b=4;
在看汇编代码之前需要复习一下之前学的数据传送指令:
;mov类中的指令将源操作数的值复制到目的操作数中。
注意: 源操作数指定的值是一个立即数,存储在寄存器或者存储器中,而目的操作数指定一个位置,要么是一个寄存器,要么是一个存储器地址。
IA32 规定:
不能使用movl指令将一个值从一个存储器位置复制到另一个存储器位置。
例如: movw (% eax),4(% esp)
取而代之,movl被拆分成两个操作:
指令1 : 将原值加载到寄存器中;
指令2 : 将该寄存器值写入到目的位置。
3. 接下来看之前的汇编代码:
所以,返回值为xp所指向的值,但是函数中xp的指向已经被改为指向y。
4. 接下来准备看一下书中的一道习题,先看给出的汇编代码
movl 8(% ebp), % edi
movl 12(% ebp),% edx
movl 16(% ebp),% ecx
movl (% edx), % ebx
movl (% ecx), % esi
movl (% edi), % eax
movl % eax , (% edx)
movl % ebx, (% ecx)
movl %esi , (% edi)
已知 原型是: void decode1( int *xp , int *yp , in *zp);
并且: xp ,yp,zp 分别在相对于寄存器% ebp 中地址值偏移8和12以及16的位置
同样再次解析:
所以最终根绝汇编代码得到的C代码是:
void decodel1(int *xp,int *yp,int *zp){
int x = *xp;
int y = *yp;
int z = *zp;
int yt = y;
int zt = z;
int xt = x;
*yp = xt;
*zp = yt;
*xp = zt;
}
正确答案是:
void decodel1(int *xp,int *yp,int *zp){
int tx = *xp;
int ty = *yp;
int tz = *zp;
*yp = tx;
*zp = ty;
*xp = tz;
}
为什么少了几行代码?答案是: 其实中间那红色的三行代码原本是不需要的,但是之前提过IA32 规定:
不能使用movl指令将一个值从一个存储器位置复制到另一个存储器位置。,所以汇编指令才引入三个寄存器,目的仅仅是赋值,并使之前的三个寄存器地址指向这三个值。
最后,文中对指针只是做了少量的举例,之后的文章,如果遇到相关问题,一定会做更详细的解析。
重点强调一下: 这些习题的答案,或者解析,都是本人自己的想法,如果有发现文中有误的地方,请一点要提出来。非常感谢!
相关推荐
"计算机系统概论(原书第二版)习题答案第五章" 计算机系统概论是计算机科学领域中的一门重要课程,本章节着重于计算机系统的基本概念和指令系统。下面是本章节的知识点总结: 1. 寻址模式(Addressing Mode):是一...
- 汇编语言是一种低级编程语言,它与机器语言密切相关,每条指令都对应机器码,便于程序员理解计算机硬件的工作原理。 - 汇编语言中的指令通常包括操作码(Opcode)和操作数(Operand),用于控制CPU执行特定的...
计算机组成原理课程设计的核心任务是...总之,这个课程设计项目旨在通过实际操作让学习者深入理解计算机系统内部的工作原理,特别是如何通过微程序来控制CPU执行加减法等基本运算,从而提升对计算机组成原理的掌握。
在计算机科学中,程序的机器级表示是理解计算机系统底层工作原理的关键部分。"第3章 程序的机器级表示Ⅱ:控制1"着重讲解了在汇编语言和机器代码层面如何实现程序的流程控制。这个章节由哈尔滨工业大学深圳计算机...
11. 计算机系统层次构造由高到低依次为应用语言机器级、操作系统机器级、汇编语言机器级、高级机器语言机器级、老式机器语言机器级和微程序机器级。 12. 计算机系统设计的重要任务包括系统构造、指令集和微架构的...
《微型计算机原理与汇编语言程序设计》是深入理解计算机系统基础的重要教材,它涵盖了计算机硬件的基本构造和软件层面的低级编程技术。这本教材通常以PPT的形式呈现,便于学习者通过视觉化的方式更好地理解和掌握...
总的来说,汇编语言程序设计是一门要求严谨逻辑和深入理解计算机硬件的学科。通过这门课程的学习,不仅能够提升编程技能,还能帮助理解计算机系统的工作原理,对于计算机科学和技术专业的人士来说,是不可或缺的基础...
汇编语言程序设计的关键在于理解计算机硬件的内部结构和工作原理,因为它直接对应于机器语言,但比机器语言更易读、易写,因为使用了助记符和保留字。 1. **机器语言与汇编语言的区别** - **机器语言**是计算机能...
计算机原理是计算机科学的基础,它涉及计算机系统的各个核心组成部分及其工作原理。南开大学的复习资料涵盖了计算机系统经典结构、冯诺依曼结构、三总线结构以及总线控制等重要概念。 1. 计算机系统经典结构: - ...
通过这个实验,学生不仅理解了运算器的基本工作原理,还掌握了实际操作硬件系统的方法,这对于深入理解计算机的内部运作具有重要意义。同时,这个实验也强调了动手能力和问题解决能力的培养,是计算机组成学习的重要...
《广东工业大学汇编程序设计》课程是一门深入探讨计算机底层运作机制的重要学科,主要...通过学习,你将能够更好地理解计算机系统的运行机制,并为将来从事系统级编程、嵌入式开发或高性能计算等工作打下坚实的基础。
计算机系统层次结构包括微程序机器级、一般机器级(机器语言级)、操作系统级、汇编语言级和高级语言级。每一层都是为上一层提供服务,简化编程和管理硬件。 2. **主存储器性能指标** - 存储容量:存储器能够容纳...
### besti计组复习-第1章 知识点总结 ...通过以上对besti计组复习-第1章的知识点总结,我们可以更深入地理解计算机组成原理的基本概念、核心部件及其工作原理,这对于学习计算机科学和技术至关重要。
本教程针对想要深入理解计算机内部运作机制的学员,提供了详尽且实用的学习资料。下面将根据提供的标题和描述,对计算机组成原理的相关知识点进行深入阐述。 一、计算机系统概述 计算机系统由硬件和软件两部分构成...
在本课程设计中,学生们被要求基于TD-CMA计算机组成原理教学实验系统设计一个简单的计算机模型机,以深入理解计算机整机的工作流程和微程序控制器的原理。 设计目的是为了让学生在学过《数字逻辑》和《计算机组成...
本文主要概述了哈尔滨工业大学(HIT)计算机系统讲解复习的关键知识点,涵盖了计算机系统的基础概念和技术细节。以下是对这些知识点的详细阐述: ...理解和掌握这些内容对于深入理解计算机系统的工作原理至关重要。
以上各章内容构成了《计算机组成原理》的核心部分,通过深入学习这些章节,可以理解计算机硬件系统的基础运作机制,为后续的系统设计和编程打下坚实基础。对于准备考试的学生来说,掌握这些知识点至关重要。