首页 > 编程语言 >Debug命令和汇编指令介绍

Debug命令和汇编指令介绍

时间:2022-10-05 22:44:18浏览次数:59  
标签:汇编 语法 地址 指令 偏移 内存 寄存器 Debug 单元

8086CPU地址:
物理地址:段地址16+偏移地址
逻辑地址:段地址:偏移地址
物理内存地址:段地址
16+偏移地址
逻辑内存地址:段地址:偏移地址
内存单元=1Byte。内存单元是字节单元,也就是一个存储单元存放一个字节。
字单元=2Byte=16Bit;一个字单元占2个连续的存储单元,以起始单元进行命名字单元。例如:2(低位Byte),3(高位Byte) 存储单元,称为2字单元。

寄存器

AX

  • 类型:通用寄存器
  • 大小:2Byte = 16Bit
  • 分为高位(AH)和低位寄存器(AL),个所占1Byte=8Bit

BX

  • 类型:通用寄存器
  • 大小:2Byte = 16Bit
  • 分为高位(AH)和低位寄存器(AL),个所占1Byte=8Bit

CX

  • 类型:通用寄存器
  • 大小:2Byte = 16Bit
  • 分为高位(AH)和低位寄存器(AL),个所占1Byte=8Bit

DX

  • 类型:通用寄存器
  • 大小:2Byte = 16Bit
  • 分为高位(AH)和低位寄存器(AL),个所占1Byte=8Bit

CS

  • 存储执行指令的段寄存器

CS:IP 指向下一条待执行的指令。

IP

  • 指定段地址的待执行处的偏移值。会根据累加每次执行汇编指令的所占字节数。

CS:IP 指向下一条待执行的指令。

BP

SI

DI

DS

  • 内存段寄存器,存储要访问内存的段地址寄存器。

需要使用mov,ds,寄存器给ds段寄存器进行赋值。直接使用mov ds,1000是无法给ds段寄存器赋值的,会直接返回Error错误。

ES

  • 类型:段寄存器
  • 作用:

SS

  • 类型:段寄存器,存储要访问段的段地址。

栈顶的段地址存放在SS(段寄存器) 中,偏移地址存放在SP(寄存器)中。
任意时刻,SS:SP 指向栈顶元素(指向字单元的低8位地址存储单元),当push和pop指令执行时,CPU会根据SS和SP中得到栈顶的地址。

SP

  • 类型:寄存器,存储要访问栈段段地址的偏移地址。逻辑语法为:SS:SP

栈顶的段地址存放在SS(段寄存器) 中,偏移地址存放在SP(寄存器)中。
任意时刻,SS:SP 指向栈顶元素(指向字单元的低8位地址存储单元),当push和pop指令执行时,CPU会根据SS和SP中得到栈顶的地址。

命令行

R

  • 作用:改变寄存器的值
  • 语法1:-r,用于查看全部寄存器的值信息
  • 语法2:-r <寄存器名>,按Entry回车后,在:号后输入值,在按Entry回车结束。

D

  • 作用:查看内存中的内容。
  • 语法1:-d 段地址:起始偏移地址 [结束偏移地址] ,查看指定地址范围的内存数据,将列出128个内存单元的内容。
  • 语法2:-d 段地址:起始偏移地址。交互式的修改数据项。
    使用方法:回车后,点前是现有的数据,点后的是要输入的替换的数据。空格以确定当前的修改内容,然后会继续下一个存储单元的修改。按Entry回车可以完成此次修改,返回主界面。
  • 语法3:-d 段寄存器:偏移地址。列出 段寄存器(的值):偏移地址 所处的内存单元的数据。

E

  • 作用:改写内存中的数据项
  • 语法1:-e 起始地址 Hex存储单元1(2Byte=16Bit) Hex存储单元2(2Byte=16Bit) [Hex存储单元N(2Byte=16Bit)...]
  • 语法2:-e 起始地址 <string|Hex|Ascll字符>
  • 语法3:-e 段寄存器:偏移地址。列出 段寄存器(的值):偏移地址 所处的内存单元的数据。

U

  • 作用:将内存中存储单元的机器码数据以汇编指令进行展示。
  • 语法1:-u 起始地址:偏移地址 [结束地址]

多次使用-u命令,可以看到连续地址所处的数据信息。可以使用-r后再使用-u可以看到当cs:ip所处的数据内容。

  • 语法2:-u 段寄存器:偏移地址。列出 段寄存器(的值):偏移地址 所处的内存单元的数据。

T

  • 作用:执行寄存器CS:IP指向内存中的汇编命令。寄存器IP会自动的更新为下一个汇编指令所处的内存位置。

针对SS段寄存器,相应的SP指令会紧随隐式执行。这涉及到中断机制

A

  • 作用:以汇编指令的形式在内存中写入机器码。
  • 语法1:-a [段地址:偏移地址]。在直接使用-a命令,则会从预设地址开始输入汇编指令。
    使用方法:一行输入一个汇编指令;结束在空行处使用Entry回车即可。
  • 语法2:-a 段寄存器:偏移地址。列出 段寄存器(的值):偏移地址 所处的内存单元的数据。

P

  • 作用:汇编程序返回所需要使用的Debug命令。

汇编命令

mov

  • 作用:将值写入左侧的寄存器中
  • 语法1:mov 寄存器,值
  • 语法2:mov [段]寄存器,[段]寄存器
  • 语法3:mov 寄存器,[偏移地址],偏移地址需要使用中括号进行包围,偏移地址是针对ds寄存器进行定位的。
    示例:mov [段]寄存器,[偏移地址],用于取出内存地址为 段地址(从ds寄存器获取):0000 处的内容传送到ax寄存器中。

    “[]”表示一个内存单元,“[....]”中的Hex值表示内存单元的偏移地址

  • 语法4:mov [偏移地址],[段]寄存器,将ax寄存器的值传送到ds:偏移地址处。

add

作用:
语法1:add 寄存器,数据
语法2:add 寄存器,寄存器
语法2:add 寄存器,内存单元,内存单元使用[]表示,但需要设置ds段寄存器表示访问内存地址的基础地址。
语法2:add 内存单元,寄存器

sub

作用:
语法1:sub 寄存器,数据
语法2:sub 寄存器,寄存器
语法2:sub 寄存器,内存单元
语法2:sub 内存单元,寄存器

push

作用:入栈,将寄存器的数据入栈。
语法:push <寄存器|段寄存器|[内存单元(需要定义内存段地址ds段寄存器)]>

注意:SS:SP逻辑地址,SP+2;因为栈使用字单元存储数据的,所以,这里需要-2。

pop

作用:出栈,用一个寄存器接收出栈的数据。
语法:pop <寄存器|段寄存器|[内存单元(需要定义内存段地址ds段寄存器)]>

注意:SS:SP逻辑地址,SP-2;因为栈使用字单元存储数据的,所以,这里需要-2。
执行步骤:

jmp

  • 语法:jmp 段地址:偏移地址
  • 示例:jmp 073F:0000;这会将CS寄存器更改为073F,IP寄存器更改为0000。类似mov cs,073F;mov ip,0000

定义:

  • 栈:具有入和出一个方向叫做栈,特征是后进先出(LIFO),也就是最后进入的会从栈中最先弹出(也可以理解为栈顶总是最后入栈的。)。栈只有2个操作,即是入栈和出栈。
    栈顶总是指向字单元的低8位。

8086CPU入栈和出栈都是以字单元(字单元所占2Byte=16Bit)进行的。
字单元用2个存储单元(1Byte)存放,高地址存储单元存放高8位,低地址存储单元存放低8位。
注意:当空栈时,此时栈中没有元素,这时SS:SP指向栈中最底部的字单元偏移地址+2地址单元处。
当栈处于段地址的最大范围时,SP处于0000:FFFF时,会循环覆盖其他存储单元的数据。例如:0000-2会导致SP指向FFFE,而FFFE+2会导致SP指向0000。

标签:汇编,语法,地址,指令,偏移,内存,寄存器,Debug,单元
From: https://www.cnblogs.com/XingXiaoMeng/p/16748248.html

相关文章

  • ida反汇编失败
    options->general->打开堆栈指针(stackpointer)可见反汇编失败提示的地址(本程序为00101481,原本此处不为000)处堆栈指针不为0,因此需要修改alt+K,修改偏移量为此时......
  • VS2005 Debug版,dll /MTd,exe /MDd 跨dll使用CString的链接错误
    dll中导出函数DLL_EXPORTvoidDoString(CString&str);如果exe和dll都是/MD,一切正常如果dll/MTd,exe/MDd则找不到DoString,错误提示:errorLNK2019:无法解析的外部符......
  • docker 基础指令
    docker基础指令#帮助指令docker[命令]--help#显示docker版本信息dockerversion#显示docker系统信息dockerinfodocker镜像使用#查看所有镜像iddock......
  • docker 常用指令
    从容器内拷贝文件到主机上点击查看代码[root@localhost~]#dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZEredislatest7614......
  • Idea在windows和mac中的一些快捷指令
    从Windows过度到Mac必备快捷键对照表Mac键盘符号说明⌘==Command⇧==Shift⇪==CapsLock⌥==Option⌃==Control↩==Return/Enter⌫==Delete......
  • RISC-V指令精讲(一):算术指令实现与调试
    本节来看下RV32I(32位整数指令集)的算数指令,先学习下加减指令(add、sub),接着了解下数值比较指令(slt),这些指令都有两个版本:一个是立即数版本,一个是寄存器版本RISCV-V指令......
  • Vue2 指令操作
    概述指令是vue为开发者提供的模板语法,用于辅助开发者渲染页面的基本结构。vue中的指令按照不同的用途可分为如下6大类:内容渲染指令。属性绑定指令。事件绑定指......
  • CPU--指令系统
    1.机器的指令的一般格式:操作码字段,地址码字段; 2.数据在存储器中的存放方式:a,从任意位置开始--不浪费空间,读写控制比较复杂; :b,从一个存储......
  • C语言与汇编
    C变量C语言是如何把各种类型的变量转换成对应的汇编语言呢?高级语言更容易被工程师理解,而汇编语言这样的低级语言,则更容易被机器解读。这是因为汇编语言里的大部分内容都......
  • 写过自定义指令吗,原理是什么?
    背景看了一些自定义指令的文章,但是探究其原理的文章却不多见,所以我决定水一篇。如何自定义指令?其实关于这个问题官方文档上已经有了很好的示例的,我们先来温故一下。除......