前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【汇编语言】寄存器(内存访问)(四)—— mov、add、sub指令

【汇编语言】寄存器(内存访问)(四)—— mov、add、sub指令

作者头像
Crossoads
发布2024-10-22 09:02:01
发布2024-10-22 09:02:01
9260
举报
文章被收录于专栏:汇编语言汇编语言

前言

📌 汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。但仅仅从课程的角度出发就太片面了,其实学习汇编语言可以深入理解计算机底层工作原理,提升代码效率,尤其在嵌入式系统和性能优化方面有重要作用。此外,它在逆向工程和安全领域不可或缺,帮助分析软件运行机制并增强漏洞修复能力。 本专栏的汇编语言学习章节主要是依据王爽老师的《汇编语言》来写的,和书中一样为了使学习的过程容易展开,我们采用以8086CPU为中央处理器的PC机来进行学习。

正文

前面我们用到了mov、add、sub指令,它们都带有两个操作对象

到现在,我们知道,mov指令可以有以下几种形式。

我们可以根据这些已知指令进行下面的推测。

(1)

既然有“mov 段寄存器,寄存器”,从寄存器向段寄存器传送数据,那么也应该有“mov 寄存器,段寄存器”,从段寄存器向寄存器传送数据。

一个合理的设想是:8086CPU内部有寄存器到段寄存器的通路,那么也应该有相反的通路。

有了推测,我们还要验证一下。进入Debug,用A命令,如下图所示

上图中,用A命令在一个预设的地址 0B39:0100处,用汇编的形式mov ax,ds 写入指令,再用T命令执行,可以看到执行的结果,段寄存器ds中的值送到了寄存器ax中。通过验证我们知道,“mov 寄存器,段寄存器”是正确的指令。

(2)

既然有“mov 内存单元,寄存器”,从寄存器向内存单元传送数据,那么也应该有“mov 内存单元,段寄存器”,从段寄存器向内存单元传送数据。

比如我们可以将段寄存器cs中的内容送入内存10000H处,指令如下。

在 Debug 中进行试验,如下图所示

上图中,当CS:IP指向0B39:0105的时候,Debug 显示当前的指令 mov [0000],cs,因为这是一条访问内存的指令,Debug还显示出指令要访问的内存单元中的内容。由于指令中的CS是一个16位寄存器,所以要访问(写入)的内存单元是一个字单元,它的偏移地址为0,段地址在ds中,Debug在屏幕右边显示出“DS:0000=0000”,我们可以知道这个字单元中的内容为 0。

mov [0000],cs执行后,CS中的数据(0B39H)被写入1000:0处,1000:1单元存放0BH,1000:0单元存放39H。

最后,用D命令从1000:0开始查看指令执行后内存中的情况,注意1000:0、1000:1两个单元的内容。

(3)

mov 段寄存器,内存单元”也应该可行。

比如我们可以用10000H处存放的字型数据设置 ds(即将10000H处存放的字型数据送入ds),指令如下。

可以自行在 Debug 中进行试验。

add 和 sub 指令同 mov 一样,都有两个操作对象。它们也可以有以下几种形式。

它们可以对段寄存器进行操作吗?

比如“add ds,ax“。请自行在 Debug 中试验。

结语

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下。

也可以点点关注,避免以后找不到我哦!

Crossoads主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的动力!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 正文
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档