简述MASM宏汇编

Hello , 我是小恒不会java。今天写写x86相关底层的东西

在这里插入图片描述

寄存器

8086由BIU和EU组成
8088/8086寄存器有14个。8通用,4段,1指针,1标志
8个通用寄存器:这些寄存器可以用来存储任意类型的数据,包括整数、地址等。8086有8个通用寄存器,分别是:
AX(Accumulator):累加器,用于存储计算结果和中间结果。
BX(Base Register):基址寄存器,用于存储基址。
CX(Count Register):计数寄存器,用于存储循环次数和计数。
DX(Data Register):数据寄存器,用于存储乘法和除法操作的数据。
SI(Source Index):源索引寄存器,用于存储源操作数的地址。
DI(Destination Index):目标索引寄存器,用于存储目标操作数的地址。
BP(Base Pointer):基址指针寄存器,用于存储基址指针。
SP(Stack Pointer):堆栈指针寄存器,用于存储堆栈顶部的地址。
4个段寄存器:这些寄存器用于存储内存段的地址。8086有4个段寄存器,分别是:
CS(Code Segment):代码段寄存器,用于存储代码段的地址。
DS(Data Segment):数据段寄存器,用于存储数据段的地址。
SS(Stack Segment):堆栈段寄存器,用于存储堆栈段的地址。
ES(Extra Segment):附加段寄存器,用于存储附加段的地址。
1个指针寄存器:
IP(Instruction Pointer):指令指针寄存器,用于存储下一条指令的地址。
1个标志寄存器:
FLAGS:标志寄存器,用于存储指令执行过程中产生的状态信息,如进位、溢出、零等。

寄存器具体隐式用法我在此不多赘述

物理地址

物理地址 (PA) = (CS << 4) + IP

常见指令

数据传输指令:

mov:移动数据,从一个寄存器到另一个寄存器,或从内存到寄存器,反之亦然。
push:将数据压入栈。 pop:从栈中弹出数据。
xchg:交换两个寄存器或一个寄存器和内存位置的内容。
lea:加载有效地址,通常用于计算内存偏移。
算术和逻辑指令:

add:加法。
sub:减法。
mul:无符号乘法。
imul:有符号乘法。
div:无符号除法。
idiv:有符号除法。
inc:递增寄存器或内存位置的内容。
dec:递减寄存器或内存位置的内容。
neg:取负数。
and:按位与。
or:按位或。
xor:按位异或。
not:按位非。
shl/sal:左移。
shr/sar:右移(逻辑右移/算术右移)。
控制流指令:
jmp:无条件跳转。
call:调用子程序。
ret:从子程序返回。
je/jz:如果相等/为零则跳转。
jne/jnz:如果不等于/不为零则跳转。
jg/jnle:如果大于/不小于等于则跳转。
jge/jnl:如果大于等于/不小于则跳转。
jl/jnge:如果小于/不大于等于则跳转。
jle/jng:如果小于等于/不大于则跳转。
test:测试寄存器或内存位置的内容,常用于条件跳转。
字符串处理指令:
lods:从字符串中加载字节/字/双字。
stos:存储字节/字/双字到字符串。
cmps:比较字符串。 scas:扫描字符串。
输入/输出指令:
in:从端口读取数据。
out:向端口写入数据。 系统指令:
syscall:执行系统调用。
int:触发中断。
iret:从中断返回。

MOV 指令
mov 是“Move”的缩写,用于在汇编语言中执行数据传输操作,即从一个源(source)复制数据到一个目标(destination)。其基本语法是:

mov dst, src

其中:

  • dst 是目标操作数,可以是寄存器、内存位置(通过地址表达式指定)或其他可寻址的数据对象。
  • src 是源操作数,同样可以是寄存器、内存位置、立即数(常数值)等。

mov 指令的主要功能是将 src 中的值直接拷贝到 dst,实现数据的移动或赋值。例如:

mov eax, ebx       ; 将 ebx 寄存器的值复制到 eax 寄存器
mov [esp], 0x1234  ; 将立即数 0x1234 存储到 esp 指向的内存位置
mov eax, [0x1000]  ; 从内存地址 0x1000 处读取数据并存入 eax 寄存器

LEA 指令
lea 是“Load Effective Address”的缩写,它的功能不是直接传送数据,而是计算并获取源操作数所代表的内存地址,并将这个地址(而非地址处的数据)存放到目标寄存器中。其基本语法是:

lea dst, src

这里的 dst 仍然是目标寄存器,而 src 是一个地址表达式,通常由一个基址寄存器加上一个偏移量(可以是常数或寄存器)构成。lea 指令并不访问内存,它仅仅计算地址表达式的值并将其存入目标寄存器。

使用 lea 的典型场景包括:

  • 快速计算数组元素的地址,无需额外的算术运算。
  • 在不实际加载数据的情况下获取变量或数据结构成员的地址。
  • 作为某种形式的算术运算(如简单的加法或乘法)的替代,特别是在地址计算中。

例如:

lea eax, [ebx + 4*ecx]  ; 计算 ebx 加上 4 倍 ecx 的值所对应的地址,并将该地址存入 eax
lea edi, [ebp - 8]      ; 获取当前栈帧中偏移量为 -8 的局部变量的地址,存入 edi

mov 指令用于数据的直接复制,而 lea 指令则用于获取和存储内存地址

代码片段

基本结构
DATAS SEGMENT; 数据定义
DATAS ENDSCODES SEGMENTASSUME CS:CODES, DS:DATAS; 主程序和子程序
CODES ENDSEND START
常用结构

.MODEL SMALL; 定义堆栈段
.STACK; 数据段声明
.DATA; 代码段声明
.CODE; 程序入口点
.STARTUP; 结束程序执行
.EXIT; 定义子程序PRINT_STRING; 程序结束标记
END
定义程序模式:练习的话用小内存模式
.MODEL SMALL
; 使用`MODEL SMALL`定义程序模式,指定小模式内存模型,程序段(代码和数据)不超过64KB。
定义字符串类型数据
 STRING  DB  'Hello World!',13,10,'$';; 声明一个字符串变量STRING,内容为'Hello World!\r\n$'; 其中,'\r'代表回车(Carriage Return,ASCII码13),'\n'代表换行(Line Feed,ASCII码10); '$'字符作为字符串结束符,某些情况下用于标识字符串的结尾
创建子程序
NAME PROC; 子程序主体代码; ...; 子程序返回RETNAME ENDP
子程序调用
 CALL NAME
计算两个数的和:
MOV AX, NUM1
ADD AX, NUM2
MOV SUM, AX
比较两个数:
MOV AX, NUM1
CMP AX, NUM2
JG GREATER
JL LESS
JE EQUAL
输出字符串到屏幕:
LEA DX, STRING;STRING为变量名
MOV AH, 9
INT 21H
读取字符:
MOV AH, 1
INT 21H
输出字符:
MOV AH, 2
MOV DL, 'A'
INT 21H

打印字符串实例

; 使用`MODEL SMALL`定义程序模式,指定小模式内存模型,程序段(代码和数据)不超过64KB。.MODEL SMALL; 定义堆栈段
.STACK; 数据段声明
.DATA; 声明一个字符串变量STRING,内容为'Hello World!\r\n$'; 其中,'\r'代表回车(Carriage Return,ASCII码13),'\n'代表换行(Line Feed,ASCII码10); '$'字符作为字符串结束符,某些情况下用于标识字符串的结尾STRING  DB  'Hello World!',13,10,'$'; 代码段声明
.CODE; 程序入口点
.STARTUP; 调用子程序PRINT_STRING,输出字符串CALL PRINT_STRING; 结束程序执行
.EXIT; 定义子程序PRINT_STRING
PRINT_STRING PROC; LEA (Load Effective Address)指令将STRING变量的地址加载到DX寄存器LEA  DX, STRING; 将AH寄存器设置为9,这是DOS中断INT 21H的功能号,表示要执行"显示字符串"操作MOV  AH, 9; 调用DOS中断INT 21H,执行显示字符串功能。此时DX寄存器保存了待显示字符串的地址INT  21H; 子程序返回RET
PRINT_STRING ENDP; 程序结束标记
END

子程序创建实例

; 使用`MODEL SMALL`定义程序模式,指定小模式内存模型,程序段(代码和数据)不超过64KB。.MODEL SMALL; 定义堆栈段
.STACK; 数据段声明
.DATA; 声明一个字符串变量STRING,内容为'Hello World!\r\n$'; 其中,'\r'代表回车(Carriage Return,ASCII码13),'\n'代表换行(Line Feed,ASCII码10); '$'字符作为字符串结束符,某些情况下用于标识字符串的结尾STRING  DB  'Hello World!',13,10,'$'; 代码段声明
.CODE; 程序入口点
.STARTUP; 调用子程序PRINT_STRING,输出字符串CALL PRINT_STRING; 结束程序执行
.EXIT; 定义子程序PRINT_STRING
PRINT_STRING PROC; LEA (Load Effective Address)指令将STRING变量的地址加载到DX寄存器LEA  DX, STRING; 将AH寄存器设置为9,这是DOS中断INT 21H的功能号,表示要执行"显示字符串"操作MOV  AH, 9; 调用DOS中断INT 21H,执行显示字符串功能。此时DX寄存器保存了待显示字符串的地址INT  21H; 子程序返回RET
PRINT_STRING ENDP; 程序结束标记
END

AH实例

AH 寄存器是 8086 汇编语言中的一个 8 位寄存器,属于 16 位寄存器 AX 的高 8 位部分

在 DOS 操作系统中,通过调用中断 21H 可以执行各种功能。这些功能由 AH 寄存器的值确定。例如,AH 寄存器的值设置为 9 表示调用 DOS 的输出字符串功能,值设置为 4CH 表示调用 DOS 的退出功能。

以下是一个简单的汇编程序示例,演示了如何使用 AH 寄存器调用 DOS 的输出字符功能:

.MODEL SMALL
.STACK
.DATACHAR DB 'A'
.CODE
.STARTUPMOV AH,2 ; 设置 AH 寄存器的值为 2,表示调用 DOS 的输出字符功能MOV DL,CHAR ; 将 CHAR 变量的值加载到 DL 寄存器INT 21H ; 调用 DOS 中断
.EXITEND

在这个示例中,程序首先将 AH 寄存器的值设置为 2,表示调用 DOS 的输出字符功能。然后,将 CHAR 变量的值加载到 DL 寄存器,最后使用 INT 21H 指令调用 DOS 中断。这将在屏幕上输出字符 ‘A’。

求和案例

;完整段的求3+5的和
DATAS  SEGMENTFIVE  DB    5
DATAS  ENDSSTACKS  SEGMENTDB  128 DUP (?)
STACKS  ENDSCODES  SEGMENTASSUME    CS:CODES,DS:DATAS,SS:STACKS
START:MOV AX,DATASMOV DS,AXMOV AL,FIVEADD AL,3ADD AL,30HMOV DL,ALMOV AH,2INT 21HMOV AH,4CHINT 21HCODES  ENDSEND  START

调用宏库案例

INCLUDE  MACROOUT.LIB;调用库DATAS SEGMENTSTRING  DB 'Hello World',13,10,'$';定义字符串数据DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,AXOUTPUT STRING;使用output库内方法;使用寄存器中断程序MOV AH,4CHINT 21HCODES ENDSEND START

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/2751.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java--数据结构】提升数据处理速度!深入理解Java中的顺序表机制

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 两种创建顺序表的方法及区别 认识ArrayList的构造方法 不带参数的构造方法 带参数的构造方法 利用Collection 构造方法 举例 ArrayList 常用方法演示 add addAll remo…

Linux进程详解三:进程状态

文章目录 进程状态Linux下的进程状态运行态-R阻塞态浅度休眠-S深度睡眠-D暂停状态-T暂停状态-t 终止态僵尸-Z死亡-X 孤儿进程 进程状态 进程的状态&#xff0c;本质上就是一个整型变量&#xff0c;在task_struct中的一个整型变量。 状态的存在决定了你的后续行为动作。 Linu…

直接用表征还是润色改写?LLM用于文生图prompt语义增强的两种范式

直接用表征还是润色改写&#xff1f;LLM用于文生图prompt语义增强的两种范式 导语 目前的文生图模型大多数都是使用 CLIP text encoder 作为 prompt 文本编码器。众所周知&#xff0c;由于训练数据是从网络上爬取的简单图文对&#xff0c;CLIP 只能理解简单语义&#xff0c;而…

拿捏 顺序表(1)

目录 1. 顺序表的分类2. 顺序表实现3. 顺序表实现完整代码4. 总结 前言: 一天xxx想存储一组数据, 并且能够轻松的实现删除和增加, 此时数组大胆站出, 但是每次都需要遍历一遍数组, 来确定已经存储的元素个数, 太麻烦了, 于是迎来了顺序表不屑的调侃: 数组你不行啊… 顺序表是一…

第二期书生浦语大模型训练营第四次笔记

大模型微调技术 大模型微调是一种通过在预训练模型的基础上&#xff0c;有针对性地微调部分参数以适应特定任务需求的方法。 微调预训练模型的方法 微调所有层&#xff1a;将预训练模型的所有层都参与微调&#xff0c;以适应新的任务。 微调顶层&#xff1a;只微调预训练模型…

oracle 12c+ max_string_size参数

一个客户的数据库版本是19.3,在做数据库复制的时候,目标端报错了,查看了一下问题发现表的字段长度有不对,在12c以前我们都知道varchar的长度最大是4000,但是客户这里居然有32767: 把客户的建表语句弄出来,放到我的一个19c的测试环境进行测试: 发现报错了: 这里报错很明显了,是M…

学习c语音的自我感受

因为是自学&#xff0c;所以走过不少弯路。去年&#xff0c;受知乎“python性能弱”风潮的影响&#xff0c;学过go,rust。 在学习这些新语言的时候&#xff0c;由衷感受到&#xff0c;或是本身侧重方向的原因&#xff08;如go侧重服务器&#xff09;&#xff0c;或是语言太新不…

uniapp——组件多颜色模块展示、气泡框

一、自定义颜色&#xff1a; 样式 代码 <template><view class"content"><!-- 右上角 --><view class"coverStatus" :class"[itemClass, positionClass,cornerClass,sanJiaoCss,sanJiaoCss2]":style"dynamicStyle&q…

python getsize如何使用

第一步&#xff0c;点击键盘 winr&#xff0c;打开运行窗口&#xff1b;在窗口中输入“cmd"&#xff0c;点击确定&#xff0c;打开windows命令行窗口。 第二步&#xff0c;在windows命令行窗口中&#xff0c;输入“python”&#xff0c;进入python交互窗口。 第三步&#…

笔记 | 嵌入式系统概论

1 嵌入式系统简介 1.1 嵌入式系统的定义 根据美国电气与电子工程师学会&#xff08;IEEE&#xff1a;Institute of Electrical and Electronics Engineers )的定义&#xff0c;嵌入式系统是用于控制、监视或辅助操作机器和设备的装置(原文: devices used to control, monitor…

WiFi、Ethenet、4G优先级切换

1、多网卡情况下如何调整优先级方案 按照目前公司前辈给出的方案&#xff0c;调整优先级的手段有两种&#xff1a; <1>.删除默认路由--route del 的方法 <2>.ifmetric源码提供的修改路由表的mteric的值来设置路由的优先级&#xff0c;metric越小优先级越高。 应…

ANSYS Help 的使用

ANSYS 帮助文档是相当实用且重要的第一手资料&#xff0c;90% 以上的纯操作问题都可以在帮助文档找到相关的解释。 点击开始菜单的 ANSYS Help即可打开帮助文档 帮助文档有两种打开方式&#xff1a; 基于帮助文档的安装包安装于本地后&#xff0c;可直接启动帮助程序没有安装…

Spring-IOC之组件扫描

版本 Spring Framework 6.0.9​ 1. 前言 通过自动扫描&#xff0c;Spring 会自动从扫描指定的包及其子包下的所有类&#xff0c;并根据类上的特定注解将该类装配到容器中&#xff0c;而无需在 XML 配置文件或 Java 配置类中逐一声明每一个 Bean。 支持的注解 Spring 支持一系…

书生·浦语大模型实战营之Llama 3 高效部署实践(LMDeploy 版)

书生浦语大模型实战营之Llama 3 高效部署实践&#xff08;LMDeploy 版&#xff09; 环境&#xff0c;模型准备LMDeploy chatTurmind和Transformer的速度对比LMDeploy模型量化(lite)LMDeploy服务(serve) 环境&#xff0c;模型准备 InternStudio 可以直接使用 studio-conda -t …

机器学习运用-民宿价格

项目简介 随着旅游业的蓬勃发展&#xff0c;民宿市场迎来了前所未有的增长机遇。正好最近在参加拓尔思数据挖掘公益实习活动&#xff0c;我的项目将应用机器学习技术开发一个价格预测模型。可以达到更好地理解和预测民宿价格的目的&#xff0c;该模型综合考虑了从容纳人数、便…

【Python】Python函数的黑魔法:递归,嵌套函数与装饰器

欢迎来到CILMY23的博客 本篇主题为&#xff1a; Python函数的黑魔法&#xff1a;递归&#xff0c;嵌套函数与装饰器 个人主页&#xff1a;CILMY23-CSDN博客 系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 感谢观看&#xff0c;支持的可以给个一键三连&#xff…

基于51单片机的矩阵按键扫描的proteus仿真

文章目录 一、按键按键按键消抖 二、独立按键仿真图仿真程序 三、矩阵按键仿真图仿真程序 四、总结 一、按键 按键 按键通常指的是电子设备上的一种输入装置&#xff0c;用于在按下时发送信号&#xff0c;以便设备执行相应的操作。按键可以分为独立按键和矩阵按键两种类型。 …

TRIZ理论下攀爬机器人的创新设计与研究

随着科技的飞速发展&#xff0c;机器人技术已广泛应用于各个领域。特别是在复杂环境下的作业&#xff0c;如灾难救援、太空探测等&#xff0c;对机器人的移动能力和适应性提出了更高要求。在这样的背景下&#xff0c;基于TRIZ理论的攀爬机器人设计与研究应运而生&#xff0c;它…

简单的图像处理算法

本笔记参考crazy_Bingo 基础&#xff1a; 图像处理都是用卷积矩阵对图像卷积计算&#xff0c;如3X3 的矩阵对640 X 480分辨率的图像卷积&#xff0c;最终会得到638 X 478 的图像。卷积过程是这样的&#xff1a; 一、中值滤波 &#xff1a; 找出矩阵中的最中间值作为像素点 中…

Flink的安装、项目创建、任务打包和部署完整实现,任务实现使用JAVA语言

Flink资源下载地址 Flink安装包下载地址 一、本地模式安装Flink 1、在Linux服务上&#xff0c;创建flink文件夹 mkdir flink 2、上传文件并解压 tar -zxvf flink-1.14.6-bin-scala_2.11.tgz 解压完成后&#xff0c;如图&#xff1a; 3、启动Flink 进入到解压目录下&#x…