第二章 指令:计算机的语言

本文深入探讨了计算机硬件的操作数,包括存储器操作数和立即数操作数。介绍了有符号数和无符号数的概念,以及计算机中指令的表示方式。详细讲解了逻辑操作、决策指令(如条件分支、循环)以及过程支持,如寄存器管理和栈操作。此外,还涵盖了MIPS、ARMv7、ARMv8和x86指令集的特点和寻址模式。
摘要由CSDN通过智能技术生成

目录

2.1 计算机硬件的操作数

2.1.1 存储器操作数

2.1.2 常数或立即数操作数

2.2 有符号数和无符号数

2.1 无符号数

2.2 有符号数

2.3 计算机中指令的表示

 2.4 逻辑操作

 2.5 决策指令

2.5.1 条件分支

2.5.2 循环

2.5.3 case/switch 语句

2.6 计算机硬件对过程的支持

2.6.1 过程使用更多的寄存器时

2.6.2 嵌套

2.6.3 在栈中为新数据分配空间

2.6.4 在堆中为新数据分配空间

2.7 表示字符串的方式

2.7.1  ASCII 码表示字符

2.7.2  Unicode 表示字符

2.8 MIPS 中 32 位立即数和寻址

2.8.1 32位立即数

2.8.2 分支和跳转中的寻址

2.8.3 MIPS寻址模式总结

2.8.4 机器语言解码

2.9 翻译并执行程序

2.10 ARMv7(32位)指令集

2.10.1 寻址模式

2.10.2 比较和条件分支

2.10.3 ARM 特色

2.11 ARMv8(64位)指令集

2.12 x86指令集

2.12.1 x86寄存器和数据寻址模式

 2.12.2 x86 整数操作

  2.12.3 x86 总结

2.13 谬误与陷阱


指令集:一个给定的计算机体系结构所包含的指令集合。

常见的指令集有MIPS、Inter X86、ARMv7和ARMv8。本书选择MIPS指令集来介绍。

存储程序概念:多种类型的指令和数据均以数字的形式存储于存储器中的概念。

下面是MIPS汇编语言指令:

MIPS操作数
名字 示例 注释
32个寄存器

$s0 - $s7,$t0 - $t9,

$a0 - $a3,$v0,$v1,

$gp,$fp,$sp,

$ra,$at,$zero

寄存器用于数据的快速存取。

在MIPS中,只能对放在寄存器中的数据执行算数操作。

寄存器$zero的值恒为0。

寄存器$at被汇编语器保留,用于处理大的常数。

2^{30} 个存储器字 Memory[0],Memory[4],... ,Memory[4294967292]

存储器只能通过数据传输指令访问。

MIPS使用字节编址,所以连续的字地址相差4。

存储器用于保存数据结构、数组和溢出的寄存器。

*注:寄存器$s0,...,$s7常用来表示变量寄存器;寄存器$t0,...,$t9常用来表示临时寄存器

MIPS汇编语言
类别 指令 示例 含义 注释
算术 加法 add $s1, $s2, $s3 $s1 = $s2 + $s3 三个寄存器操作数(有且仅有三个操作数,且必须在寄存器中选取)
减法 sub $s1, $s2, $s3 $s1 = $s2 - $s3 三个寄存器操作数
立即数加法 addi $s1, $s2, 20 $s1 = $s2 + 20 常用于加常数数据
数据传输 取字 lw $s1, 20 ($s2) $s1 = Memory[$2 + 20] 内存-->寄存器(一个字)
存字 sw $s1, 20 ($s2) Memory[$s2+20] = $1 寄存器-->内存(一个字)
取半字 lh $s1, 20 ($s2) $s1 = Memory[$2 + 20] 内存-->寄存器(半字)
取无符号半字 lhu $s1, 20 ($s2) $s1 = Memory[$2 + 20] 内存-->寄存器(半字)
存半字 sh $s1, 20 ($s2) Memory[$s2+20] = $1 寄存器-->内存(半字)
取字节 lb $s1, 20 ($s2) $s1 = Memory[$2 + 20] 内存-->寄存器(一个字节)
取无符号字节 lbu $s1, 20 ($s2) $s1 = Memory[$2 + 20] 内存-->寄存器(一个字节)
存字节 sb $s1, 20 ($s2) Memory[$s2+20] = $1 寄存器-->内存(一个字节)
取链接字 ll $s1, 20 ($s2) $s1 = Memory[$2 + 20] 取字作为原子交换的前半部分
存条件字 sc $s1, 20 ($s2)

Memory[$s2+20] = $1;

$s1 = 0 or 1

存字作为原子交换的后半部分
取立即数的高位 lui $s1, 20  $s1 = 20*2^{16} 取立即数并放在高16位
逻辑 and $s1, $s2, $s3 $s1 = $s2 & $s3 三个寄存器操作数
or $s1, $s2, $s3 $s1 = $s2 | $s3 三个寄存器操作数
或非 nor $s1, $s2, $s3 $s1 = ~($s2 | $s3) 三个寄存器操作数
立即数与 andi $s1, $s2, 20 $s1 = $s2 & 20 和常数按位与
立即数或 ori $s1, $s2, 20 $s1 = $s2 | 20 和常数按位或
逻辑左移 sll $s1, $s2, 10 $s1 = $s2 << 10 常数左移相应位
逻辑右移 srl $s1, $s2, 10 $s1 = $s2 >> 10 常数右移相应位
条件分支 等于时跳转 beq $s1, $s2, 25

if( $s1 == $s2 ) go to

PC + 4 +100

相等检测;

和PC相关的跳转

不等于时跳转 bne $s1, $s2, 25

if( $s1 != $s2 ) go to

PC + 4 +100

不相等检测;

和PC相关的跳转

小于时置位 slt $s1, $s2, $s3

if( $s2 < $s3 ) $s1 = 1;

else $s1 = 0

比较是否小于

无符号数比较

小于时置位

sltu $s1, $s2, $s3

if( $s2 < $s3 ) $s1 = 1;

else $s1 = 0

比较是否小于无符号数

无符号数比较

小于立即数时置位

slti $s1, $s2, 20

if( $s2 < 20 ) $s1 = 1;

else $s1 = 0

比较是否小于常数

无符号数比较

小于无符号立即数时置位

sltiu $s1, $s2, 20

if( $s2 < 20 ) $s1 = 1;

else $s1 = 0

比较是否小于无符号常数
无条件跳转 跳转 j 2500 go to 10000 跳转至目标地址
跳转至寄存器所指位置 jr $ra go to $ra

用于switch语句,

以及过程调用

跳转并链接 jal 2500

$ra =  PC + 4;

go to 10000

用于过程调用

*注意:三个寄存器操作数:有且只有3个操作数,且操作数只能从32个32bit寄存器中选取。

硬件设计三条基本原则

        1、简单源于规整(只有三个操作数)

        2、越小越好(只有32个寄存器)

        3、优秀的设计需要适宜的折中方案(R型-->I型,见2.3节)

2.1 计算机硬件的操作数

寄存器大小:MIPS体系结构中寄存器大小为32bit。

:计算机中基本的访问单位,32bit。

        MIPS体系中共有32个寄存器,是由于设计原则2:越小越好受指令格式位数的限制。       

*注意:MIPS也有64bit的版本MIPS-64,其具有32个64bit的寄存器。此处32bit指的是MIPS-32。

2.1.1 存储器操作数

地址:用于在存储器空间中指明某特定数据元素的位置的值。

数据传送指令:存储器和寄存器之间传送数据的指令。

        数据传送指令又分为取数指令存数指令

取数(load)指令:存储器-->寄存器,

 存数(store)指令:寄存器-->存储器,

按字节编址:存储器被划分成若干个单元,每个单元容量为1个字节(8bit),从0开始编号(地址)。MIPS是按字节编址的

  • 1
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值