简述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想存储一组数据, 并且能够轻松的实现删除和增加, 此时数组大胆站出, 但是每次都需要遍历一遍数组, 来确定已经存储的元素个数, 太麻烦了, 于是迎来了顺序表不屑的调侃: 数组你不行啊… 顺序表是一…

C++面向对象——类与对象

文章目录 类与对象构造函数、析构函数get/set方法函数&#xff1a;类内声明、类外定义staticthis指针友元名字空间 类与对象 #include<iostream> #include<string> using namespace std; /* 类与对象 */ class Person{public:string name;// 固有属性&#xff0c…

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

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

oracle 12c+ max_string_size参数

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

开通一个幻兽帕鲁专用服务器多少钱?阿里云挺便宜

阿里云开通一个幻兽帕鲁专用服务器多少钱&#xff1f;26元1个月。目前阿里云幻兽帕鲁专用服务器4核16G配置26.52元1个月、149元半年&#xff0c;8核32G服务器90.60元一个月、271.80元3个月&#xff0c;幻兽帕鲁服务器活动页面 aliyunfuwuqi.com/go/palworld 阿里云服务器网整理…

$nextTick 原理及作用

Vue 的 nextTick 其本质是对 JavaScript 执行原理 EventLoop 的一种应用。 nextTick 的核心是利用了如 Promise 、MutationObserver、setImmediate、setTimeout的原生 JavaScript 方法来模拟对应的微/宏任务的实现, 本质是为了利用 JavaScript 的这些异步回调任务队列来实现…

auto关键字的妙用

基本概念 C11中的auto关键字是C语言的一个重大改进&#xff0c;它提供了一种类型推导的机制&#xff0c;允许开发者让编译器自动推导变量的类型&#xff0c;从而简化代码并提高可读性。 常见使用场景 1、循环中迭代变量的类型推导 当处理容器或其他迭代器时&#xff0c;aut…

学习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交互窗口。 第三步&#…

【Linux】解决切换用户出现bash-4.2$问题

切换用户出现 bash 4.2 问题 出现 bash 4.2 错误 发现是用户指定家目录下 缺少2个隐藏文件 这题前提条件 我指定的家目录是 /opt/{孙悟空,猪八戒,唐僧,沙悟净} /etc/skel/.bashrc /etc/skel/.bash_profile 传过去后显示登录成功 问题展示&#xff1a; [rootlocalhost…

前端系列-2 模块化CommonJs+AMD+CMD+ES6

模块化 js中, 一个文件就是一个模块&#xff0c;模块化可以提高代码利用率而减少重复代码&#xff0c;将相同的逻辑维护在一个模块中&#xff0c;分而治之&#xff0c;提高代码的可维护性&#xff1b;另外&#xff0c;模块化的出现可以在工程中引入第三方模块&#xff0c;极大…

揭秘油烟净化器保持餐饮厨房清新通畅的秘诀

我最近分析了餐饮市场的油烟净化器等产品报告&#xff0c;解决了餐饮业厨房油腻的难题&#xff0c;更加方便了在餐饮业和商业场所有需求的小伙伴们。 在餐饮厨房中&#xff0c;油烟净化器的作用不可忽视。它不仅是清洁空气的工具&#xff0c;更是提升生活品质的保障。让我们一…

音频数据分析注意事项

注意事项一、音频读取 1.librosa.load(path, sr16000) 读取的结果是&#xff0c;数据类型是浮点型 2.df_yin wave.open(path, rb) params df_yin.getparams() nchannels, sampwidth, framerate, nframes params[:4] strData df_yin.readframes(nframes) data np.frombuf…

笔记 | 嵌入式系统概论

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;可直接启动帮助程序没有安装…