我是靠谱客的博主 英俊短靴,最近开发中收集的这篇文章主要介绍汇编语言光速入门指令集架构机器语言汇编语言寄存器实模式&保护模式的异同计算机是怎么运行的lea 指令解析Intel汇编代码示例AT&T汇编代码示例,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

指令集架构

  • Instruction Set Architecture,ISA
  • 复杂指令集(Complex Instruction Set Computer)
    • 包含许多应用程序中很少使用的特定指令
    • x86
  • 精简指令集(Reduced Instruction Set Computer)
    • 包含的指令少
    • 提供比较高的速度
    • 处理器的尺寸更小,
    • 以及较少的电力损耗
    • ARM、MIPS

机器语言

  • 机器码(Machine Code),由01组成,是处理器执行的字节级程序(01序列)
  • 每一条语句都是01组成
  • 穿孔纸带保存程序(1打孔,0不打孔)

举例:8086CPU完成运算 S = 768 + 12288 - 1280,对应机器码
101100000000000000000011
000001010000000000110000
001011010000000000000101

汇编语言

由汇编指令、伪指令等组成

  • 汇编码(Assembly Code):机器指令的便于记忆和阅读的书写格式,人类可读,比如add 、 mov等

机器指令: 1000100111011000
操 作:寄存器bx的内容送到ax中
汇编指令:movw %bx, %ax

  • 高级语言–>汇编指令–>汇编器–>机器码–>被计算机识别
  • 汇编语言无可移植性,高级语言具有可移植性

AT&T 汇编、Intel汇编格式的差别

IntelAT&T
寄存器名称EAX%eax
操作数顺序operator D<–Soperator S–>D
立即数格式无$符号有$符号 $0x1A
操作数长度由word ptr指定由movq/movb指定
间接寻址方式mov eax, [ebx+3]movl 3(%ebx) ,%eax
变址寻址方式mov [ebx + eax*8 + array],ecxmovl %ecx,array(%ebx,%eax,8)
汇编器nasmgas

寄存器

  • CPU内部的高速储存单元,访问速度远高于内存
  • rdx、edx、dx分别表示64位、32位、16位的dx寄存器
    • r:Register
    • e:extend
32位16位高 8 位低 8 位
EAXAXAHAL
EBXBXBHBL
ECXCXCHCL
EDXDXDHDL

通用寄存器

  • EAX
    • 拓展累加寄存器,乘法、除法被自动使用
    • 保存函数的返回值
  • ECX 循环计数器
  • ESI、EDI 源变址寄存器、目的变址寄存器
  • ESP 栈顶指针
  • EBP 栈底指针

段寄存器(segment register)

实模式下,段地址:偏移地址构成地址,而段寄存器保存段地址

  • CS:存放代码段地址
  • SS:存放堆栈段地址
  • DS
    • 实模式下:数据段地址
    • 保护模式下:段描述符表的地址
  • ES:拓展段寄存器
  • FS:标志段寄存器
  • GS:全局段寄存器

EIP

  • 指令(Instuctor)指针(pointer)寄存器
  • 始终存放下一条要被CPU执行的指令的地址

EFLAGS

反映CPU执行的算术和逻辑操作结果的状态标志

  • OF:overflow flag
  • ZF:zero flag
  • CF:carry flag
  • SF:sign flag
  • AF:assistant carry flag
  • PF:parity flag

系统寄存器

仅允许运行在最高特权级的程序(例如:操作系统内核)访问的寄存器,任何应用程序禁止访问

  • 中断描述符表寄存器IDTR:保存中断描述符表的地址。
  • 全局描述符表寄存器GDTR
    • 保存全局描述符表的地址,全局段描述符表包含了任务状态段和局部描述符表的指针
  • 局部描述符表寄存器LDTR
    • 保存当前正在运行的程序的代码段、数据段和堆栈段的指针
  • 任务寄存器
    • 保存当前执行任务的任务状态段的地址。
  • 调试寄存器
    • 用于调试程序时设置断点

实模式&保护模式的异同

实模式

  • 20位地址总线,可以访问1MB(0~FFFFF)内存( 2 20 2^{20} 220=1MB)
  • 16位数据线,需要内存分段才能表示20位地址
  • 段:内存空间被划分为64KB的段
  • 段地址存放于16位的段寄存器中(CS、DS、ES、SS)
  • 物理地址=段地址*10H+偏移地址

保护模式

  • 32位地址总线寻址,每个程序可寻址4GB内存:0~FFFFFFFF( 2 32 = 2 30 ∗ 4 2^{32}=2^{30}*4 232=2304
  • 段寄存器(CS、DS、SS、ES、FS和GS)指向段描述符表项
    • 操作系统使用段描述符表定位程序使用的段的位置
    • CS存放代码段描述符表项的地址
    • DS存放数据段描述符表项的地址
    • SS存放堆栈段描述符表项的地址
  • 所有段被映射到32位物理地址空间
  • 程序至少两个段:代码段和数据段(CS、DS)
  • 分页:将一个段分割成称为页(Pages)的4KB的内存块
  • 缺页:当任务运行时,当前活跃的执行代码保留在内存中,而程序中当前未使用的部分,将继续保存在磁盘上。当CPU需要执行的当前代码存储在磁盘上时,产生一个缺页错误,引起所需页面的换进(从磁盘载入内存)
  • 分页意义:通过分页以及页面的换进、换出,一台内存有限的计算机上可以同时运行多个大程序,让人感觉这台机器的内存无限大,因此称为虚拟内存

计算机是怎么运行的

  • 取指令
    • 在地址CS:IP/EIP/RIP处取出指令(分别对应实模式、32位、64位)
    • IP/EIP/RIP = IP/EIP/RIP + 所读取指令的长度
    • IP/EIP/RIP指向下一条指令
  • 执行指令
    • 执行
    • 取指令
  • 重复上面过程

lea 指令解析

它(指leaq)的指令形式是从内存读数据到寄存器,但实际上它根本就没有引用内存。他的第一个操作数看上去是一个内存引用,但该指令并不是从指定的位置读入数据,而是将有效地址写入到目的操作数

lea:load effective address

leaq (%rdi,%rsi,4), %rax
  • 源操作数:(%rdi,%rsi,4)
  • 目的操作数:%rax
  • 作用:将源操作数的地址,也即是%rdi + 4 * %rsi 装载入%rax。%rax=%rdi + 4 * %rsi

leal [A, B, C] D 的语义就是 D = A + B * C

  • 可以把A理解为数组的基地址
  • C理解为数组的某个元素
  • 该指令就是将A数组的第C个元素的地址存到D里面

Intel汇编代码示例

; hello.asm
.data ; 数据段声明
msg db "Hello, world! --------- Intel ASM .", 0xA ; 要输出的字符串
len equ $ - msg ; 字串长度
.text ; 代码段声明
global _start ; 指定入口函数
_start: ; 在屏幕上显示一个字符串
mov edx, len ; 参数三:字符串长度
mov ecx, msg ; 参数二:要显示的字符串
mov ebx, 1 ; 参数一:文件描述符(stdout)
mov eax, 4 ; 系统调用号(sys_write)
int 0x80 ; 调用内核功能
; 退出程序
mov ebx, 0 ; 参数一:退出代码
mov eax, 1 ; 系统调用号(sys_exit)
int 0x80 ; 调用内核功能

AT&T汇编代码示例

  #hello.s
.data # 数据段声明
msg : .string "Hello, world! --------- AT&T ASMrn " # 要输出的字符串
len = . - msg # 字串长度
.text # 代码段声明
.global _start # 指定入口函数
_start: # 在屏幕上显示一个字符串
movl $len, %edx # 参数三:字符串长度
movl $msg, %ecx # 参数二:要显示的字符串
movl $1, %ebx # 参数一:文件描述符(stdout)
movl $4, %eax # 系统调用号(sys_write)
int $0x80 # 调用内核功能
# 退出程序
movl $0,%ebx # 参数一:退出代码
movl $1,%eax # 系统调用号(sys_exit)
int $0x80 # 调用内核功能

最后

以上就是英俊短靴为你收集整理的汇编语言光速入门指令集架构机器语言汇编语言寄存器实模式&保护模式的异同计算机是怎么运行的lea 指令解析Intel汇编代码示例AT&T汇编代码示例的全部内容,希望文章能够帮你解决汇编语言光速入门指令集架构机器语言汇编语言寄存器实模式&保护模式的异同计算机是怎么运行的lea 指令解析Intel汇编代码示例AT&T汇编代码示例所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部