(五)《汇编语言(王爽)》 | 实验 2:用机器指令和汇编指令编程

2024-01-05 18:08

本文主要是介绍(五)《汇编语言(王爽)》 | 实验 2:用机器指令和汇编指令编程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


1. 预备知识

  • 在 实验1 中提到,Debug 中的指令 d 段地址:偏移地址可查看相应内存单元的值,而其中的段地址其实是存放在 DS 寄存器中。同时,d 指令也提供了一种 CPU 机理的格式:d 段寄存器:偏移地址,其中段寄存器可以是 CS、DS、SS 等,如:
d ds:0	# 查看段地址:0开始的内存区间中的内容
d cs:0	# 查看当前代码段中的指令代码
d ss:0	# 查看当前栈段中的内容
  • 同理,e、a、u 等可以带有内存单元的指令中,也可以同 d 指令一样,用段寄存器表示内存单元的段地址。

  • t 指令在修改表示栈段的寄存器 SS 的指令时,下一条指令也紧接着被执行。


2. 实验任务

(1)根据逐条执行指令,写出指令执行完成后的情况。首先,使用 Debug 指令查看相关内存的内容:

请添加图片描述

指令AXBXSP修改的内存单元地址修改的内存单元内容
mov ax,ffffFFFF----
mov ds,axFFFF----
mov ax,22002200----
mov ss,ax2200----
mov sp,01002200-0100--
mov ax,[0]C0EA(FFFF:0000)-0100--
add ax,[2]C0FC-0100--
mov bx,[4]C0FC30F0(FFFF:0004)0100--
add bx,[6]C0FC60210100--
push axC0FC602100FE2200:00FE 00FFC0FC
push bxC0FC602100FC2200:00FC 00FD6021
pop ax6021602100FE--
pop bx6021C0FC0100--
push [4]6021C0FC00FE2200:00FE 00FF30F0
push [6]6021C0FC00FC2200:00FC 00FD2F31

说明:SS=2200、SP=0100 表示栈空状态,段寄存器 DS=FFFF:

  • 第 6 行,将 FFFF:0000 内存单元的值送入寄存器 AX;
  • 第 8 行,将 FFFF:0004 内存单元的值送入寄存器 BX;
  • 第 10 行,元素入栈,SP=00FE(0100 - 2),2200:00FF 存放 C0、2000:00FE 存放 FC(大端,下同);
  • 第 12 行,当前 SP=2200、SP=00FC,所以将 2200:00FD 的值 60 和 2200:00FC 的值 21 送入寄存器 AX 中,且 SP=00FE(00FC + 2);
  • 第 14 行,将 FFFF:0004 内存单元的值入栈,2200:00FF=30、2200:00FE=F0,且 SP=00FE(0100 - 2)。

(2)在没有认为对 2000:0~2000:F 内存单元值更改的情况下,这部分值自动发生了变化。如下图,前四条指令是:

mov ax,2000
mov ss,ax
mov sp,10

只执行了两次 t 指令,程序却已完成三条语句的内容(SP 寄存器内容已更改),指令 mov sp,10 自动执行了,这和预备知识里的最后一点一致,文中提到这与中断机制有关,从而更改了相关内存单元的值。

请添加图片描述


这篇关于(五)《汇编语言(王爽)》 | 实验 2:用机器指令和汇编指令编程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/573704

相关文章

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

Java实现远程执行Shell指令

《Java实现远程执行Shell指令》文章介绍使用JSch在SpringBoot项目中实现远程Shell操作,涵盖环境配置、依赖引入及工具类编写,详解分号和双与号执行多指令的区别... 目录软硬件环境说明编写执行Shell指令的工具类总结jsch(Java Secure Channel)是SSH2的一个纯J

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

C#异步编程ConfigureAwait的使用小结

《C#异步编程ConfigureAwait的使用小结》本文介绍了异步编程在GUI和服务器端应用的优势,详细的介绍了async和await的关键作用,通过实例解析了在UI线程正确使用await.Conf... 异步编程是并发的一种形式,它有两大好处:对于面向终端用户的GUI程序,提高了响应能力对于服务器端应

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

Python 异步编程 asyncio简介及基本用法

《Python异步编程asyncio简介及基本用法》asyncio是Python的一个库,用于编写并发代码,使用协程、任务和Futures来处理I/O密集型和高延迟操作,本文给大家介绍Python... 目录1、asyncio是什么IO密集型任务特征2、怎么用1、基本用法2、关键字 async1、async

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.