汇编语言基础从零开始详解【第一话】

汇编语言零基础入门学习教程 汇编语言是一种最低级、最古老、不具有移植性的编程语言,它能够直接访问计算机硬件,所以执行效率极高,占用资源极少,一般用于嵌入式设备、驱动程序、实时应用、核心算法等。 汇编语言的缺点是开发周期特别长,实现一个简单的功能都非常麻烦,已经很少用来编写应用程序了。 这套汇编语言入门教程基于 Windows 32/64 位系统,讲解与 Intel 和 AMD 处理器相兼容的汇编语言程序设计,让大家认识机... 阅读详情

汇编发展至今,有两类指令组成:真汇编指令:这些是真指令,每一个都有对应的机器码;伪指令:由汇编编译器翻译成多条真指令,并没有真实对应的机器指令;

实验环境配置:汇编语言基础从零开始详解【第零话】汇编实验环境配置

1. 寄存器

CPU是核心,使用汇编就相当于再软件层面控制CPU,如果想让CPU工作你就必须给他提供指令和数据,指令和数据都放在存储器(内存)里面。在我们看来,指令和数据有着区别,但在机器看来是没有区别的,我们需要利用CPU暂存的寄存器区分开指令和数据。寄存器的作用就相当中转站。以8086PC为例子,有14个寄存器:

  • 通用寄存器:ax,bx,cx,dx
  • 段寄存器:cs,ss,ds,es
  • 地址寄存器:ip,sp,bp
  • 状态字寄存器:psw
  • 索引寄存器:si,di

1.1 通用寄存器

通用寄存器一般是16bit,也就是那些以x结尾的寄存器,我们是可以把一个16b的寄存器拆为两个8b的寄存器使用的,我们可以把一个x寄存器拆为h和l
例如:ax=ah+al

在寄存器里面的数据类型按数据的尺寸进行分类,分为byte(字节)和word(字)
一个word一般是两个byte

指令:
mov 寄存器,寄存器/数据
add 寄存器,寄存器/数据
sub 寄存器,寄存器/数据

【问题1】寄存器的溢出问题
因为一个通用寄存器只有16b,当运算结果长于16b的时候就会溢出。

4b=1个十六进制位=1个十六进制0

执行以下指令:

mov ax,8226h
mov bx,8226h
add ax,bx

我们在VS2019的监视窗口里面可以跟踪到ax最后的数据是044c,但实际上8226+8226=1044c,但因为ax是16b,只能存4个十六进制位。

【问题2】拆分寄存器使用的时候运算也是拆开运算,进位也会可能溢出。
执行以下指令:

mov ax,00aah
mov bx,00a6h
add al,bl

监视ax的变化,会发现最后只有0050。虽然aa+a6=150,但因为是拆分之后运算的,所以进的位不会存到高位的,所以发生溢出。

【问题3】实现自身数值乘2

add self,self

1.2 段寄存器和地址寄存器

在学习段寄存器和地址寄存器之前,我们必须先学习8086CPU是如何读写内存的。如下图:
在这里插入图片描述
小朋友你是否有这样的问号:16+16为毛=20?
实际上,20位的物理地址是由存储硬件本身条件决定的,但是由于CPU手上的位数不够,就只能用两个组合地址来表示一个物理地址了,而地址加法器的公式:

用十进制来看
物理地址=段地址x16+偏移地址

这个16就相当于16进制的数后面多加一个0。

举例:
已知段地址1230h,偏移地址0236h
12300+0236=12536

当CPU想要访问内存单元的时候,他需要知道段地址和偏移地址,而我们存放段地址的
用的是段寄存器,存放偏移地址的地址寄存器。

1.2.1 代码指令型地址寄存器:CS和IP

假如我们从内存里面拿指令出来:
最常用的搭配就是CS和IP,(代码型段寄存器和指令指针寄存器)。
在这里插入图片描述
在这里插入图片描述
如何修改段寄存器和指令指针寄存器的内容?
对于通用寄存器,我们修改寄存器的内容用的是mov命令,但是mov缺不能用于CS和IP寄存器,我们使用专门的地址修改命令:jmp。一般来说,一个物理地址的表示:(段地址:偏移地址)。
所以,跳转到一个新的物理地址的指令:

jmp 段地址:偏移地址(同时修改CS和IP)
jmp 偏移地址值(仅修改IP)
jmp 某一寄存器 (取该寄存器的值作为新的地址)好似:mov IP,ax

jmp 2ae3:3
jmp ax

1.2.2 数据型地址寄存器:DS

对于存放指令的内存部位我们使用 CS:IP的形式访问,如果是普通的数据,我们就会利用(数据段地址寄存器)DS:[address]的形式访问。

从零开始学ARM Coretex-M3(STM32F1) 汇编语言(一) 前言 如今基于ARM内核的处理器被广泛运用于各种场景,说是无人不知无人不晓也毫不过分。本文将从零开始讲解如何用汇编语言编写 可运行在ARM Coretex-M3处理器上的程序,并尝试使用ARM Coretex-M3处理器的各种功能。 [目... 阅读详情

相关推荐

Intel汇编语言程序设计学习-第一章 基本概念

Intel汇编语言程序设计学习-第一章 基本概念

天使也掉毛 2470

从零开始学汇编(汇编语言背景介绍+知识集合)

x86汇编知识集合显示字符 显示字符 B8000H-BFFFFH的内存空间是显存地址, 32K大小, 向这个地址写入数据就可以打印到屏幕上了。

crabstew的博客 1502

掌握汇编语言:基础教程详解

本文还有配套的精品资源,点击获取 简介:汇编语言是与机器硬件直接交互的编程语言,与特定处理器架构紧密相关,提供了对硬件资源的直接控制。本基础教程涵盖了汇编语言的核心概念,如指令集、寄存器、地址转换、宏汇编等,以及其语法和程序编写过程。它还将探讨汇编语言在系统级编程、性能优化等领域的应用,并强调了宏汇编对于代码复用和错误减少的重要性。 1. 汇编语言基础概念和特点 ...

weixin_42298164的博客 1518

嵌入式汇编语言从小白到入门:从零开始的底层编程之旅

汇编语言是一种低级的、面向特定处理器架构的编程语言,它与机器指令一一对应,通过助记符(如MOV、ADD等)来表示二进制机器指令。直接硬件操作:可以直接访问和操作寄存器、内存等硬件资源高效性:编译后代码精简,执行效率高特定性:不同处理器架构有不同的汇编语言底层控制:能够精确控制每一个硬件操作系统启动代码(Bootloader)对性能要求极高的关键代码段直接硬件操作(如寄存器配置)中断服务程序需要精确时序控制的操作嵌入式汇编语言学习是一条充满挑战但也极具回报的道路。

niuTyler的博客 1741

汇编语言王爽老师习题详解

在汇编语言中,一个程序通常被划分为不同的段(segments)。段是程序中用于存放不同数据类型或代码的内存区域。这种划分对于管理程序中的数据和代码至关重要,因为它有助于操作系统和处理器来管理内存空间。最基本的段包括代码段(code segment)、数据段(data segment)和堆栈段(stack segment)。代码段用于存放程序的指令代码,数据段存放全局变量和静态数据,而堆栈段则用于管理过程调用和局部变量。段的定义方法依赖于具体的汇编语言和目标架构。

weixin_35390379的博客 798

apm软件仿真+QGC地面站 环境搭建

本教程使用场景:apm软件仿真运行于虚拟机 ubuntu环境。qgc地面站位于windows 系统。两个环境在同一台电脑上。 一.apm仿真环境搭建 1.安装vm虚拟机及ubuntu 18。 2.ubuntu下 下载Ardupilot 飞控源码 并配置环境。 下载源码: git clone https://github.com/ArduPilot/ardupilot cd ardupilot git submodule update --init --recursive 配置所需运行的环境:

qthello 6109

汇编零基础入门

这篇文章是写给对汇编有些兴趣但是又不喜欢麻烦的小伙伴们。你只需要找一个线上的汇编模拟器即可!本文将涉及10个最常用的指令和三大程序结构

jimmy1881415157的博客 4165

使用循环神经网络预测温度

简介 本文以天气时间序列数据集为例,讨论如何使用深度学习模型预测未来天气温度。 使用的是由德国耶拿马克思普朗克生物地球化学研究所的气象站记录。 数据每10分钟记录一次,共记录14种不同的量,如气温、气压、湿度、风向等,原始数据可追溯到2003年,本例只使用2009-2016年的数据。 数据 下载并解压数据略。 加载数据: data_dir = r'E:\practice\tf2\temperature' fname = os.path.join(data_dir, 'jena_climate_2009_

guotianqing的博客 5281

汇编语言快速入门(非常详细)

汇编语言程序以段为单位进行书写,一般把数据定义在数据段里,程序写在代码段中。段名 SEGMENT .. .(段的内容) .. .段名 ENDS①汇编语言不区分字母的大小写。②汇编语言中一行只能有一条语句。③段的名字用字母或下划线开头,需要做到含义清晰且不能与保留字重名。④汇编语言中用英文分号后的内容表示程序注释。⑤不能在一个段的内部定义另一个段,也就是各个段之间相互独立。数据的定义是指对给出的数据分配存储单元,并将它们以标准的格式存放到数据段中。

hanmo22357的博客 8万+

手把手教你用Three.js+Vue打造3D机房可视化系统(附完整代码)

本文详细介绍了如何使用Three.js与Vue 3构建企业级3D机房可视化系统。从技术选型、项目架构设计到3D场景构建、设备建模与渲染策略,提供了完整的开发方案和实战代码。重点讲解了如何实现设备状态实时监控、交互操作与性能优化,帮助开发者快速掌握3D可视化开发的核心技术。

ttt77的博客 315

ROS2_Moveit2_Ur5e_Grasp项目详解(二):核心模块功能解析

本文深入解析了ROS2_Moveit2_Ur5e_Grasp项目的核心模块功能。重点阐述了OctoMap建图模块如何为机械臂提供实时三维环境感知,并详细介绍了Robotiq夹爪与MoveIt2的集成控制、UR5e的运动规划策略,以及视觉模块如何协同工作,最终实现从目标检测到动态抓取的完整闭环。

weixin_29254029的博客 109

汇编语言入门教程

一、汇编语言是什么 ​ 汇编语言是二进制指令(操作码)的文本形式,与指令是一一对应的关系。比如加法指令00000011写成汇编语言就是ADD 二、前置知识——寄存器 ​ 1、寄存器不依靠地址区分,而依靠名称,CPU通过名字去具体的寄存器拿数据。 ​ 2、寄存器的种类 ​ 分为通用和专用寄存区 EAX EBX ECX EDX EDI ESI EBP 栈的基地址,不发生改变 ESP 用来保存当前栈的地址(栈指针的位置,值会随着压栈、弹栈发生变化) 三、前置知识——Heap(堆) ​ 由用户主动请

as you know, nlp is fantasitc! 1万+

Index-TTS-1.5:多模态语音合成的技术演进与商业落地实践

本文深入探讨了Index-TTS-1.5在多模态语音合成领域的技术演进与商业落地。该模型基于GPT风格的自回归Transformer架构,通过优化条件编码器和引入字符-拼音混合建模,显著提升了语音生成的稳定性、精准度和真实感,实现了高质量的零样本语音克隆。文章还详细介绍了其云端体验、本地WebUI部署及ComfyUI集成等实战路径,并分析了其在虚拟数字人、个性化内容创作等商业场景中的应用潜力与挑战。

weixin_29098367的博客 400

汇编语言学习笔记(【汇编语言】小甲鱼零基础汇编)

汇编语言学习笔记(【汇编语言】小甲鱼零基础汇编) 目录 第〇章 课程资料 第一章 基础知识 第二章 寄存器(CPU工作原理) 第三章 寄存器(内存访问) 第四章 第一个程序 第五章 [BX]和loop指令 第六章 包含多个段的程序 第七章 更灵活定位内存地址 第八章 数据处理的两个基本问题 第九章 转移指令的原理 第十章 call和ret指令 第十一章 标志寄存器 第十二章 内中断 第十三章 int指令 第十四章 端口 第十五章 外中断 第十六章 直接定址表 第十七章 使用BIOS进入键盘输入和磁盘读写

inv1796915552的博客 3万+

用LTspice仿真Buck电路输出电容:从参数计算到波形优化的全流程演示

本文详细介绍了使用LTspice仿真Buck电路输出电容的全流程,从理论计算到波形优化。通过解析关键参数如纹波电压、瞬态响应和ESR,结合工程计算方法和LTspice仿真技巧,帮助工程师优化Buck电路设计,解决输出纹波过大和瞬态响应不佳的问题。

night的博客 851

[RK3568 Android11] 开发之默认授予系统预置的APP权限

目录 一、系统预置的APP权限 二、默认授予系统预置的APP权限 一、系统预置的APP权限 1、在打开系统预置的APP时,都会弹窗提示,并且需要人工确定授予权限; 2、有些客户对定制有需求,需要系统预置的APP自动默认授予权限; 二、默认授予系统预置的APP权限 注意此方法只对系统预置的APP起效果,后期手动安装的APP无效; 修改文件: frameworks/base/services/core/java/com/android/server/pm/per...

~未来可期~ 5058

《汇编语言》第一章基础知识

《汇编语言》第一章基础知识

生活是修行的博客 851

【RT-DETR有效改进】全新的SOATA轻量化下采样操作ADown(轻量又涨点,附手撕结构图)

本文给大家带来的改进机制是利用2024/02/21号最新发布的YOLOv9其中提出的ADown模块来改进我们的Conv模块,其中YOLOv9针对于这个模块并没有介绍,只是在其项目文件中用到了,我将其整理出来用于我们的YOLOv8的项目,经过实验我发现该卷积模块(作为下采样模块)首先可以大幅度降低参数值,其次其精度上也有很高的提升,同时本文的内容目前网络上并无其它人总结(也是最新发布的,可以说BUff是集满了)大家可以尝试以下在自己数据集上的效果。

Snu77的博客 4768

汇编语言 | 基础知识

汇编语言是计算机提供给用户的最快最有效的语言,也是能够利用计算机的所有硬件特性并能够直接控制硬件的唯一语言。但是由于编写和调试汇编语言程序要比高级语言复杂,因此目前其应用不如高级语言广泛。通过汇编语言的学习,可以具有在 CPU 的寄存器级上进行控制和操作的能力,获得直接对计算机硬件底层编程经验,从而对计算机系统有更深刻的认识。

尼泊罗河伯的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

汇编语言学习之路:从基础到精通的全方位指南

本文既概括了学习的基础,也指明了学习的目标,同时强调了这是一个全方位、系统性的学习指南,适合想要深入学习汇编语言的读者。通过这篇文章,读者可以了解到学习汇编语言的各个阶段、需要掌握的关键知识点、推荐的学习资源以及实践方法,从而规划出一条清晰、高效的学习路线。

byte轻骑兵的技术小窝 6070

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【第一节】汇编语言的介绍

汇编语言是一种低级编程语言,它使用助记符(mnemonics)来表示机器指令。与机器语言相比,汇编语言更易于人类阅读和编写。

攻城狮7号的博客 2822

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

汇编语言 第一章-基础知识

【学习汇编主要是:学习汇编的编程思想,掌握机器运行的思维】汇编语言是直接在硬件上工作的编程语言,首先要了解硬件系统的结构,才能有效的应用汇编语言对其编程。1.汇编课程的研究重点如何利用硬件系统的编程结构和指令集有效灵活的控制系统进行工作2.汇编语言的主体是汇编指令3.汇编指令和机器指令的差别在于指令的表示方法上汇编指令是机器指令便于记忆的书写格式4.汇编语言时机器指令的助记符5.汇编语言的组成1.汇编指令(机器码的助记符)2.伪指令(由编译器执行)

2302_80490510的博客 843

汇编语言笔记(一)——汇编语言基础

汇编

翻肚鱼儿的博客 2727

【汇编语言入门】从第一个加法程序吃透汇编核心基础

变量定义语法为变量名 数据类型 初始值表示定义名为sum的变量,DWORD为32位双字数据类型,初始值为0。其中sum为标识符,作为变量内存地址的别名;DWORD为数据类型伪指令,标识变量占用32位(4字节)内存空间;0为变量初始常量值,汇编时写入对应内存地址。汇编程序通过.data、.code、.stack伪指令划分数据段、代码段与栈段,实现数据存储与指令执行的分离。明确汇编指令的四大组成部分,掌握标号、助记符、操作数、注释的定义与使用规则,理解NOP指令的地址对齐作用。

-曾牛的博客 993

汇编语言:第一讲

我们在基于一个计算机硬件系统编程的时候,必须知道这个系统中的内存地址空间分配情况。

d3535的博客 2648

【汇编语言学习Day-01】第一章:基础知识

参考书籍:《汇编语言(第2版)》——王爽,参考视频:《零基础入门学习汇编语言》——小甲鱼 第一章:基础知识 前言  汇编语言是直接在硬件之上工作的编程语言,我们首先要了解硬件系统的结构,才能有效地应用汇编语言对其编程。  在汇编课程中我们不对硬件系统进行全面和深入的研究。  关于PC机及CPU物理结构和编程结构的全面研究,在《微机原理与接口》中进行。  对于计算机一般的结构、功能、性能的研究在一门称为《组成原理》的理论层次更高的课程中进行。  汇编课程的研究重点放在如何利用硬件系统的编程结构和指令集有效灵活

Au9_0xD的博客 1353
上一篇: MASM汇编入门:寄存器数据的使用
下一篇: 汇编语言:易错总结
JintuZheng
博客等级 码龄11年 1483粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值