首页 > 编程语言 >汇编语言学习

汇编语言学习

时间:2023-01-08 18:00:10浏览次数:47  
标签:汇编语言 mov 学习 地址 指令 内存 寄存器 ax

汇编语言学习

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 指令

push 和 pop 指令
push ax 将ax的数据压入栈中 
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 比较ax和bx的值
zf=1 说明 ax=bx
zf=0 说明 ax≠bx
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指令 除法 默认AX 或 DX
	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。由于BL为80H=1000 0000,最高位也即符号位为1,在进行带符号扩展时,其扩展的高8位均为1,故赋值AX为1111 1111 1000 0000,即AX=FF80H。
2.mov CL, 50H
	MOVSX AX, CL
	50H=0101 0000,最高位为0,则AX为0000 0000 0101 0000
结果AX = 50H

标签:汇编语言,mov,学习,地址,指令,内存,寄存器,ax
From: https://www.cnblogs.com/fallrain/p/17034994.html

相关文章

  • C语言学习--常量指针与指针常量
    指针常量#include<stdio.h>#include<string.h>//常量指针:是一个指针,定义不用初始化,能改变指向,但是指向的内容不能被修改constint*p;//指针常量:是一个常量,这......
  • C语言学习--指针函数与函数指针
       #include<stdio.h>#include<string.h>//指针函数:是一个函数,但是这个函数的返回值类型是一个指针//函数指针:是一个指针,这个指针的指向是一个函数//下面......
  • 学习.NET MAUI Blazor(五)、修改Window窗口标题
    由于Blazor属于SPA(single-pageapplication),所以页面标题需要使用PageTitle组件来实现。但是在MAUIBlazor中,Blazor所在的位置是WebView,而标题是属于window。所以在MAUIBla......
  • 【博学谷学习记录】超强总结,用心分享|狂野架构docker常用命令
    目录容器技术应用Docker简单命令Docker安装关闭防火墙安装依赖环境设置仓库安装DockerEngine开启Docker自动补全web应用操作运行一个web应用查看WEB应用容器访问WEB......
  • 最短路问题学习笔记
    之前对最短路的认识不是很充分,结合之前的博客来重新总结一下最短路的问题的解法。Floyd算法——小数据杀手相信最先接触的最短路算法就是Floyd算法了,因为他精简的代码实......
  • Kafka学习笔记(十):Resetting Offsets
    ConsumerGroups-ResetOffsetskafka-consumer-groups.sh#Replace"kafka-consumer-groups"#by"kafka-consumer-groups.sh"or"kafka-consumer-groups.bat"based......
  • pytorch简单学习
    目录Dataset从电脑文件中读入数据集从torchvision官方获取提供的数据集transforms什么是transforms什么是tensorDataLoadertensorboard这四个东西之间的关系(简单理解)Dat......
  • 学习笔记——在IDEA中创建Maven工程之HelloWord;Maven中常见的问题;Maven核心概念之POM
    2023-01-08一、在IDEA中创建Maven工程之HelloWord(1)新建一个Maven工程  最后点击“finish”,完成项目创建(2)在创建的项目下,选中“maven_demo”,右击新建“Module”,选......
  • Kafka学习笔记(九):CLI Consumer in Groups & Consumer Groups
    CLIConsumerinGroupswithkafka-console-consumer.sh#Replace"kafka-console-consumer.sh"#by"kafka-console-consumer"or"kafka-console-consumer.bat"base......
  • P1_学习目标
    目标能够知道如何创建小程序项目能够清楚小程序项目的基本组成结构能够知道小程序页面由几个部分组成能够知道小程序中常见的组件如何使用能够知道小程序如何进行协......