汇编 | mov. add. sub指令
Description
前面我们用到了mov, add. sub指令,它们都带有两个操作对象。到现在,我们知道,mov指令可以有以下几种形式。
mov 寄存器,数据 比如: mov ax,8
mov 寄存器,寄存器 比如: mov ax,bx
mov 寄存器,内存单元 比如: mov ax,[0]
mov 内存单元,寄存器 比如: mov [0],ax
mov 段寄存器,寄存器 比如: mov ds,ax
我们可以根据这些己知指令进行下面的推测。
既然有
“mov段寄存器,寄存器”
,从寄存器向段寄存器传送数据,那么也应该有
“mov寄存器,段寄存器”
,从段寄存器向寄存器传送数据。一个合理的设想是:8086CPU内部有寄存器到段寄存器的通路,那么也应该有相反的通路。
有了推测,我们还要验证一下。进入Debug,用 \(-A\) 命令,如下图3.4所示。
图中,用A命令在一个预设的地 \(0B39:0100\)处,用汇编的形式 mov ax,ds
写入指令,再用T命令执行,可以看到执行的结果,段寄存器 ds
中的值送到了寄存器 ax
中。
通过验证我们知道,“mov寄存器,段寄存器”
是正确的指令。
既然有
“mov内存单元,寄存器”
,从寄存器向内存单元传送数据,那么也应该有
“mov内存单元,段寄存器”
,从段寄存器向内存单元传送数据。比如我们可以将段寄存器 \(cs\) 中的内容送入内存 \(10000H\) 处,指令如下。
mov ax,1000H
mov ds,ax
mov [0],cs
在Debug中进行试验,如图3.5所示。
图3.5中,当 \(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\)两个单元的内容。
- "mov段寄存器,内存单元”也应该可行,比如我们可以用1 0000H处存放的字型数据设置ds(即将1 0000H处存放的字型数据送入ds),指令如下。
mov ax,1000H
mov ds,ax
mov ds,[0]
可以自行在Debug中进行试验。
add和sub指令同mov一样,都有两个操作对象。它们也可以有以下几种形式。
它们可以对段寄存器进行操作吗?比如“add ds,ax"
。请自行在Debug中试验。
汇编 | mov. add. sub指令的更多相关文章
- 汇编-MOV指令
知识点: MOV指令 基址 内联汇编 把OD附加到资源管理器右键菜单 一.MOV指令 aaa=0x889977;//MOV DWORD PTR DS:[0x403018],0x8899 ...
- (32位汇编 五)mov/add/sub/and/or/xor/not
本文链接:https://blog.csdn.net/pl20140910/article/details/78227133说明符号 说明r 通用寄存器m 代表内存imm 代表立即数r8 代表8位通用 ...
- 汇编 STD和CLD指令
一.用纯汇编封装函数strcmpW 1.用repnz scasw计算字串长度 2.用repz cmpsw比较字串内容 3.把比较的结果存放在EAX里边返回 __declspec(naked) int ...
- 汇编 MOV -2
知识点: MOV指令 基址 内联汇编 把OD附加到资源管理器右键菜单 一.MOV指令 aaa=0x889977;//MOV DWORD PTR DS:[0x403018],0x8899 ...
- 学 Win32 汇编[28] - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等
http://www.cnblogs.com/del/archive/2010/04/16/1713886.html 跳转指令分三类:一.无条件跳转: JMP;二.根据 CX.ECX 寄存器的值跳转: ...
- Ubuntu x86-64汇编(3) 数值操作指令
指令标注 Operand Notation 指令instruction即运算operation, 操作的对象为一个或多个运算数operand, 使用不同的标记表示不同的约束 <reg> ...
- ARM 汇编指 跳转指令 b , bl
1. 跳转指令 [ b ] [ bl ] 指令格式:<opcode><cond> <address> 不带返回的跳转指令:b mov r0, #0x12 mov ...
- 【汇编】字符串处理指令 stosb、lodsb、movsw、scasb、rep
一.字符串处理指令 (1) lodsb.lodsw:把DS:SI指向的存储单元中的数据装入AL或AX,然后根据DF标志增减SI (2) stosb.stosw:把AL或AX中的数据装入ES:DI指向的 ...
- Debug和汇编编译器masm对指令的不同处理
我们在Debug和源程序中写入同样形式的指令 : "mov al,[0]","mov bl,[1]","mov cl,[2]"," ...
- 汇编 (NOT)按位取反指令
知识点: (NOT)按位取反指令 逻辑取反(!) 按位取反(~) SETZ(SETE) 取ZF位值保存 SETNZ(SETNE)将ZF位值取反后保存 一.逻辑取反(!) !111 ...
随机推荐
- In 查询及其优化
translator Afrikaans Albanian - shqipe Arabic - العربية Armenian - Հայերէն Azerbaijani - azərb ...
- 自定义springboot-starter 动态数据源
自定义springboot-starter 动态数据源 如果使用的是spring或springboot框架,spring提供了一个实现动态数据源的一个抽象类AbstractRoutingDataSou ...
- Apache Paimon流式湖仓学习交流群成立
Apache Paimon是一个流式数据湖平台.致力于构建一个实时.高效的流式数据湖平台.这个项目采用了先进的流式计算技术,使企业能够实时处理和分析大量数据.Apache Paimon 的核心优势在于 ...
- .NET8 依赖注入
依赖注入(Dependency Injection,简称DI)是一种设计模式,用于解耦组件(服务)之间的依赖关系.它通过将依赖关系的创建和管理交给外部容器来实现,而不是在组件(服务)内部直接创建依赖对 ...
- 创建一个循环写入数据有事务提交的oracle函数示例
/*创建函数*/create or replace function fnc_testtempInfo(startDate IN varchar2, endDate in varchar2) retu ...
- 基于yolo的口罩识别(开源代码和数据集)
2020年开头真的很人意外,开年爆发了疫情.此次疫情牵动了各行各业,在这里衷心的感谢奋斗在一线的医疗工作者:您们辛苦了.作为一名非医专业的学生,在这样情况下,除了不乱跑以外,我也想以另一种方式去致敬那 ...
- Educational Codeforces Round 26 Problem A
A. Text Volume time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- StringBuilder、StringBuffer
StringBuilder 1.concat() 拼接字符串 2.indexOf() 查找 3.replace() 替换 4.subString(1,2) 截取 0,1,2 1开始 2结束 Strin ...
- ASR项目实战-任务队列在文件转写特性中的应用
转写时长超出60秒的语音文件,业界的竞品通常会使用创建异步转写任务的方式来提供支持. 一个简单.直接的实现方案,即: 网关服务接收到来自客户的转写请求时,将任务信息持久化至任务队列中. 由算法服务的实 ...
- CTFHub XSS DOM反射 WriteUp
前言:本文需要注册一个xss平台,以接收xss反弹回来的数据,请自己在互联网上寻找合适的xss平台 1. 构造闭合语句 根据题目提示,判断网站存在DOM xss漏洞 查看页面源代码,发现关键位置,其中 ...