汇编语言学习

汇编语言学习

1、基础知识

这部分内容之前就有在电子书上学习过,趁着寒假买了本二手的《汇编语言》 (二手就是香)结果发现好像在纸质书上学习比在电子书上学习更清楚。。

CPU 与外部器件进行以下三种信息交互

  • 存储单元的的地址(地址信息)
  • 器件选择,读或写的命令(控制信息)
  • 读或写的数据(数据信息)

以及与其他芯片连接的导线用于传数据

  • 地址线(寻址)
  • 数据线 (数据)
  • 控制线 (指令)

然后有一个之前觉得挺新的地方 ,就是内存地址中虽然我们看上去各个存储器是分开的,但是在CPU看来地址是连着的


2、寄存器

  • 运算器:负责进行信息处理
  • 寄存器:负责进行信息存储
  • 控制器:控制各个器件进行工作
  • 内部总线:连接各种器件,在它们之间进行数据传送

8086cpu寄存器都是16位,AX、BX、CX、DX通常存一般性数据 16位寄存器只能存放4位十六进制数据 寄存器可分为两个8位寄存器AH和AL(命名一次类推)

16位结构CPU具有以下方面的结构特点

  • 运算器一次最多可以处理16位数据(十进制65535)
  • 寄存器的最大宽度为16位
  • 寄存器和运算器之间的通路为16位

段地址与偏移地址的概念

在CPU中因为CPU本身结构问题,一次性处理、传输、展示存储的地址为16位,故提供两个地址,一个段地址,一个偏移地址。通过将段地址*16+偏移地址来实现。

段寄存器 CS、DS、SS、ES

CS 代码段寄存器 IP为指令指针寄存器 img

通过地址加法器将CS和IP的指令处理 经地址总线对内存访问,对内存中的存放的机器指令通过数据总线传递至CPU执行

DS寄存器, 用来存放要访问数据的段地址

mov指令可以读取内存单元的内容 通过
mov al,[0]实现,其中[0]表示偏移地址 指令执行时,自动取DS寄存器中的数据作为段地址

然后DS无法直接通过 mov ds 1000H实现将段地址数据直接送入DS 而是只能通过中转寄存器实现

任何两个地址连续的内存单元,可以将它们看成两个内存单元,也可看成一个地址为N的子单元中的高位字节单元和地位字节单元

mov指令可以有一下几种形式

mov指令可以有以下几种形式
mov 寄存器,数据
mov 寄存器,寄存器
mov 寄存器,内存单元
mov 内存单元,寄存器
mov 段寄存器,寄存器
mov 寄存器,段寄存器

[address]表示一个编译地址为address的内存单元

在内存和寄存器之间传送字形数据的时候,搞地质单元和高8位寄存器、低地址单元和低8位寄存器相对应

栈(一个有意思的话题)

push 和pop 指令

pushpop 指令
push axax的数据压入栈中
pop ax 从栈顶取出数据赋值于ax

段寄存器SS和寄存器SP

栈顶的段地址存放在SS中,偏移地址存放在SP中。任意时刻,SS:SP指向栈顶元素。push和pop指令执行时,CPU从SS和SP中得到栈顶的地址

push ax 执行时 操作以下两步

  1. SP=SP-2,SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶;
  2. 想ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶

入栈时,栈顶从高地址向低地址增长。

img

EAX、ECX、EDX、EBX:為ax,bx,cx,dx的延伸,各為32位元
ESI、EDI、ESP、EBP:為SI,di,sp,bp的延伸,32位元CPU中的各个部件用于不同的作用

BX、SI、DI、DP可以用在 [..]进行内存单元寻址、

X ptr 指明内存单元的长度,X可为word(字)或byte(字节)

程序编译

编程 -> 编译 -> test.obj-> 连接 -> text.exe -> 加载 -> 内存中的程序 -> 运行

CALL 和 RET指令

ret指令 相当于 pop IP

call指令

  1. 将当前的IP或CS和IP压入栈中
  2. 转移

call 标号 将当前的IP压栈中 团岛标号处执行指令

标志寄存器

  1. 存储相关指令的某些执行结构
  2. 用来为CPU执行相关指令提供行为依据
  3. 用来控制CPU的相关工作方式

cmp指令 比较指令 通过比较改变一些标志寄存器的值

cmp ax bx 比较axbx的值
zf=1 说明 ax=bx
zf=0 说明 axbx
cf=1 说明 ax<bx
cf=0 说明 ax>=bx
cf=0且zf=0 ax>bx
cf=1或zf=1 ax<=bx
jz指令 当zf=1时跳转
jnz指令 当zf=0时跳转
jge 大于转移指令

IP寄存器 为指令寄存器


一些指令

mov 传送指令 可理解为赋值
add 加法指令
sub 减法指令
jmp 修改CS IP寄存器内容 即修改段地址和偏移地址
jmp 段地址:偏移地址
jmp 某一合法寄存器 功能 用寄存器的值修改IP
and 与指令
or 或指令
div指令 除法 默认AXDX
div reg
div 内存单元
后为除数
jmp short 转到标号处执行指令 转移结束后CS:IP指向标号处的指令
inc 算数运算指令,起到+1作用
mul 乘法指令 同div 8位默认AL 16位默认 reg或内存字单元
cmp指令 比较
MOVSX指令 带符号传送例如:
1.
MOV BL,80H
MOVSX AX,BL
运行完以上汇编语句之后,AX的值为FF80H。由于BL80H=1000 0000,最高位也即符号位为1,在进行带符号扩展时,其扩展的高8位均为1,故赋值AX1111 1111 1000 0000,即AX=FF80H
2.mov CL, 50H
MOVSX AX, CL
50H=0101 0000,最高位为0,则AX0000 0000 0101 0000
结果AX = 50H
posted @   kayoki  阅读(174)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示