【汇编语言】清华大学学堂在线《汇编语言程序设计》课程学习笔记

0 前言

全是基于x86系列处理器

1 寄存器与存储器的区别

在这里插入图片描述

2 汇编程序员眼中的系统结构

  1. 指令寄存器 PC(Program Counter)
    指向下一条指令的地址
  • 16位 CS:IP
  • 32位 EIP
  • 64位 RIP
  1. 寄存器与寄存器堆(Registers)
  • 在处理器内部以名字方式访问的快速存储单元
  • 寄存器堆:一系列寄存器的集合
  1. 条件码(Condition Codes)

在这里插入图片描述
汇编程序员眼中,就是CPU,Memory还有他们直接的通路,还有他们的内部信息,汇编程序员直接考虑CPU和Memory要去怎么做。

3 指令的执行过程

在这里插入图片描述
执行完指令之后,会有状态的变化(Condition codes的变化),这些变化,会被后面的其他指令作为依据进行相关判断,从而执行相关命令,例如C语言if else的本质,就是这么回事。

4 C语言与汇编语言

在这里插入图片描述
在AT&T格式中,通过后缀,表明操作的是哪种类型的数据。

这种表示方式,不容易出错,显式地说明了数据的宽度。

5 汇编语言实例:两个整数相加

C语言代码

#include <stdio.h>
#include <Windows.h>


int main() {
	int a = 1;
	int b = 3;

	int t = a + b;

	int c = 1 + 22;

	system("pause");
	return 0;
}

对应的汇编代码
在这里插入图片描述
右图可知

  1. 对于int t = a + b;被分解为三个步骤
    1. 从内存中取得a
    2. 从内存中取得b并于a相加
    3. 结果放入内存中的t中
  2. 对于int c = 1+ 22;在编译阶段,直接将立即数的加法算了出来

寻址方式中的[bx - 11H] 减法没有关系,如果减过头(bx < 11H),那么就会重新轮回,这个要根据机器数的宽度决定。

在这里插入图片描述
在这里插入图片描述
x86指令集是变长的,不同指令的字节数不一样。

add指令,整数加法不区分有无符号,本质都是机器数相加,输出什么取决于放在哪里,当然,没有这么做加法的,因为没有实际意义

给出一段代码比较

unsigned short a = 40000;
short b = 1;
unsigned short c = a + b;

在这里插入图片描述
2.

unsigned short a = 40000;
short b = 1;
short c = a + b;

在这里插入图片描述

思考:浮点数加法呢?

6 mov传送指令

在这里插入图片描述
在这里插入图片描述
不能两个都是内存单元,是因为硬件不好实现。

x86指令中,至多有一个操作数是内存单元
在这里插入图片描述

发布了30 篇原创文章 · 获赞 13 · 访问量 5890

猜你喜欢

转载自blog.csdn.net/weixin_42929607/article/details/105618281
今日推荐