首页 > 编程语言 >学习汇编语言的第三天

学习汇编语言的第三天

时间:2024-12-22 14:27:08浏览次数:10  
标签:汇编语言 IP SP MOV 第三天 学习 地址 CS AX

 内容概述

通过学习完栈的简单原理,以及相应的ss,sp寄存器的使用。现在已经学习了三种“段”,分别是数据段,代码段,栈段。对于我这种小白极其容易混淆,于是打算进行区分比较。(手把手投喂)

1.数据段

①对应需要的寄存器:DS

②作用:通过将段地址存放到DS,输入访问内存单元的指令,CPU就将我们定义的数据段中的内容当做数据来访问。

③注意事项:1.由于8086CPU不支持将数据直接送入到寄存器的操作,于是需要进行中转。比如我想将段地址设为1000H(由于段地址*16,实际对应的地址为10000H),那么我就要进行中转操作:MOV AX,1000H      MOV DS,AX   2.对下列指令的分析(右侧是10000H:0 3地址对应的原始数据)

10000H23
10001H11
10002H22
10003H66

MOV  AX,1000H

MOV  DS,AX

MOV  AX,[0]

MOV  [2],AX

 首先1,2步就是将段地址设为1000H,第3步是将1000H*16+0出的数据送入到AX,10001H存储在高八位,10000H放在低八位,此时AX中的内容为1123H,第4步就是将此时AX中的内容放在10002H处,同样有高八位和低八位的区别,此时10002H的内容就为23H,10003H的内容为11H。

2.代码段 

①对应需要的寄存器:CS(不能直接赋值),IP

②作用:根据需要将某个段地址当作代码段,利用CS,IP指向让CPU知道从哪开始执行,进而执行代码。

③注意事项:这里的CS,IP可以直接被赋值,没有DS那么麻烦。由于底层机器并不能解析我们输入的汇编语言,便会将汇编语言转换成机器码。为了更好的理解分析下列代码

 -R //查看寄存器中的内容,主要看CS,IP(CS:1000H,IP:0000H)

内存中的机器码
10000HB8
10001H23
10002H01
10003HB8
10004H00
10005H00
10006H8B
10007HDB
10008HFF
10009HE3

-T  //执行CS,IP对应的物理地址的代码

10000H--10002H对应的汇编语言为 MOV AX,0123H

10003H--10005H对应的汇编语言为 MOV  AX,0000 

当输入-T后便会执行第一步代码,此时AX中的内容变为0123H,当然对应的CS,IP中的内容也会变化,段地址CS不变,而IP会+3(由于这个汇编指令需要三个内存单元存储,执行完后,会变成0003,以便执行下一行代码)前面所学的U命令就可以将机器码转化为汇编语言。

3.栈段

①对应需要的寄存器:SS,SP(栈空时,SS,SP指向栈空间最高地址单元的下一个单元),比如:栈空间在10000H--1000FH,1那么SS,SP就指向1000F+1=10010H的地址

②作用:8086CPU提供入栈(PUSH)和出栈(POP),入栈和出栈都是以字为单位(1个字=两个字节)

后续将起始地址为N的字单元简称为N地址单元。比如一个字由2,3两个内存单元组成,可以说是2地址字单元

③注意事项:由于CPU提供入栈和出栈的操作机制,那么就分别对这两种操作进行解释

  • PUSH
1000BH
1000CH
1000DH23
1000EH01

MOV  AX,0123H

PUSH  AX

 默认未执行前栈段为空,此时SS,SP指向10010H,CPU执行时,首先SP先减2(因为一个字为一个单位),然后再将AX中的内容放到栈中,依据高八位和低八位,那么执行后的栈中内容就如上图所示。

  • POP
1000BH
1000CH
1000DH23
1000FH01

POP BX

延续上个内容,将输入栈中的内容释放出来(如果有多个数据要遵循LAST  IN  FIRST  OUT后进先出)CPU执行这段内容时与PUSH完全相反,先是执行POP BX,然后SP+2,就又回到栈顶了。

4.总结

当然上述不同的段并非一定独立存在,有时一段地址中既是代码段,数据段又是栈段

比如:

MOV  AX,1000H

MOV  SS,AX

MOV  SP,0020H    //初始化栈顶

MOV  AX,CS

MOV  DS,AX       //将CS地址给DS数据段地址

MOV  AX,[0]

PUSH  AX

POP   BX

在上述内容中CS,IP指向10000H,这段代码得以执行。可以看出,这段地址中既是代码段,数据段又是栈段。

标签:汇编语言,IP,SP,MOV,第三天,学习,地址,CS,AX
From: https://blog.csdn.net/whitehat_/article/details/144644810

相关文章

  • 20241422 《计算机基础与程序设计》第13周学习总结
    2024-2025-120241422《计算机基础与程序设计》第13周学习总结作业信息这个作业属于哪个课程(2024-2025-1-计算机基础与程序设计)这个作业要求在哪里(2024-2025-1计算机基础与程序设计第十三周作业)这个作业的目标信息系统、数据库与SQL、人工智能与专家系统、人工......
  • 学习生物后的鲜花&思考:自然选择下,人类为何抑郁?
    本文几乎没有任何现实依据,全是脑子里乱跑。前几天在思考这样一串问题:为什么那些具有抑郁倾向和自杀倾向的基因会在自然选择从里被保留下来呢?具有这些性状的个体显然应该是被自然选择淘汰掉了才对阿?(杀的就是你哈)为什么那些编码着噩梦的片段得以从从几万年几亿年的尺度上保留下来......
  • dvwa靶场学习—1、VMware16虚拟机安装win10系统
    参考:https://blog.csdn.net/u013097500/article/details/130922242?ops_request_misc=%257B%2522request%255Fid%2522%253A%25229f57538a8985bd22b94ddc3c4206a75e%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=9f57538a8985bd22b94ddc3c4......
  • 强化学习SQL算法(soft q learning)—— SVGD的实现(Stein Variational Gradient Descent:
    代码实现地址:https://openi.pcl.ac.cn/devilmaycry812839668/softlearning/src/branch/master/softlearning/misc/kernel.pyfromdistutils.versionimportLooseVersionimportnumpyasnpimporttensorflowastfdefadaptive_isotropic_gaussian_kernel(xs,ys,h_min......
  • Unity Shader学习日记 part 3 线性代数--矩阵变换
            之前我们学到了矩阵的相关基础,了解矩阵使用了进行变幻的。可是在三维空间中我们不管是表示点还是向量,都是通过x,y,z来表示的。那我们如何在三维向量中,表示出来变换的呢?齐次坐标    齐次坐标:将原本的n维向量用n+1维来表示。    原因:1.不论是......
  • 2024-2025-1(20241321)《计算机基础与程序设计》第十三周学习总结
    这个作业属于哪个课程<班级的链接>(2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2024-2025-1计算机基础与程序设计第十三周作业)这个作业的目标<深刻学习C语言,反思一周学习,温故知新>作业正文...本博客链接https://www.cnblogs.com/guc......
  • 2024-2025-1 20241314 《计算机基础与程序设计》第十三周学习总结
    2024-2025-120241314《计算机基础与程序设计》第十三周学习总结作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里2024-2025-1计算机基础与程序设计第十三周作业这个作业的目标作业正文正文教材学习内容总结第12章:文......
  • 2024-2025-1 20241311 《计算机基础与程序设计》第十三周学习总结
    学期2024-2025-1学号20241311《计算机基础与程序设计》第十三周学习总结作业信息这个作业属于哪个课程<班级的链接>2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>2024-2025-1计算机基础与程序设计第一周作业)这个作业的目标<写上具......
  • 2024-2025-1 20241415 《计算机基础与程序设计》第十三周学习总结
    2024-2025-120241415《计算机基础与程序设计》第十三周学习总结作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里2024-2025-1计算机基础与程序设计第十三周作业这个作业的目标复习知识,巩固所学作业正文https://www.cnblogs......
  • 深度学习框架mmdetection原理解析
    1.mmcv\cnn\builder.py:注册一个创建模型的方式(这里是根据配置文件)MODELS=Registry('model',build_func=build_model_from_cfg)2.mmdet\models\builder.py:DETECTORS=MODELS,创建检测器入口DETECTORS.build_detector(cfg,train_cfg=None,test......