汇编语言(第四版) 实验一 查看CPU和内存,用机器指令和汇编指令编程

简介: 汇编语言(第四版) 实验一 查看CPU和内存,用机器指令和汇编指令编程

实验环境安装:

Debug DOSBox MASM6 百度云链接

预备知识

什么是Debug?

Debug是DOS、Winodws都提供的实模式(8086 方式)程序的调试工具。使用它可以查看CPU各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行

使用到的Debug功能

R命令查看、改变CPU寄存器的内容

D命令查看内存中的内容(机器指令形式)

E命令改写内存中的内容——即提供指令(使用机器指令),用得比较少,多为A命令

U命令查看内存中的内容(将机器指令形式转换为汇编指令的形式)

T命令执行一条汇编(机器)指令(就是执行当前指令缓冲器中的·指令)

A命令相比较E,使用汇编指令进行内存修改——向内存提供机器指令

P命令在遇到汇编指令为int xx 时,使用p指令结束(否则CPU会指向一个未知的地址段)


debug存放目录

-r 查看、改变CPU寄存器的内容

-r 查看CPU寄存器

此时CS=073F,IP=0000,即内存073F:0000处的指令为CPU当前要读取、执行的指令。


Debug 还列出了CS : IP 所指向的内存单元处所存放的机器码,并将它翻译为汇编指令。


可以看到, CS:IP 所指向的内存单元为073F:0000, 此处存放的机器码为00 00, 对应的汇编指令为[BX+SI],AL


-r 修改寄存器AX中的内容

82e66ce0f79103ef283fb07e9dd6ed0d_0c2edbba41224a7f5aebdcb4dda44591.png

-r 修改CS和IP中的内容

4eb60fceb9a297365f5bde15843fda71_83ea10debda6cb1999fc5a8009e7ddf9.png

CS:IP指向FFFF:1234,此处存放的机器码为38886504 对应的汇编指令是[BX+SI+0465],CL


-d 命令查看内存中的内容

-d 查看内存中的内容

-d内存0000H 处的内容,可以用" d 段地址:偏移地址”的格式来查看


用D 命令查看内存0000 : 0 处的内容

e103ee584c7efde85f212e56a518f621_8aecf00f3b1c61d1746bac9cba4f0464.png


使用" d 段地址:偏移地址”的格式, Debug 将列出从指定内存单元开始的128 个内存单元的内容。在使用d 0000:0 后, Debug 列出了0000:0~ 0000:7F 中的内容。

中间是从指定地址开始的128个内存单元的内容,用十六进制的格式输出,每行的输出从16 的整数倍的地址开始,最多输出16 个单元的内容

内存0000:0 单元中的内容是60H, 内存0000:1单元中的内容是10H, 内存0000:0~0000:F中的内容都在第一行;内存1000: 10~ 1000: IF 中的内容都在第二行。注意在每行的中间有一个"-"'它将每行的输出分为两部分,这样便于查看

左边是每行的起始地址。

右边是每个内存单元中的数据对应的可显示的ASCII 码字符。比如,内存单元0000:1e、0000:28、0000:4C中存放的数据是70H 、55H 、40H, 它对应的ASCII 字符分别是"p" 、"U" 、"e" ; 内存单元0000:0中的数据是00H, 它没有对应可显示的ASCll字符, Debug 就用"."来代替。

在使用" d 段地址:偏移地址”之后,接着使用D 命令,可列出后续的内容

-d命令的查看范围

此时采用" d 段地址:起始偏移地址结尾偏移地址”的格式。比如要看0000:0-0000:9 中的内容,可以用"d 0000:0 9" 实现


如果我们就想查看内存单元1000H 中的内容,可以用图2. 39 中的任何一种方法看到,因为图中的所有“段地址偏移地址”都表示了10000H 这一物理地址。

用3 种不同的段地址和偏移地址查看同—个物理地址中的内容


-e命令改写内存中的内容

-e 命令改写内存中的内容


可以使用E 命令来改写内存中的内容,比如,要将内存1000:0~ 1000:9 单元中的内容分别写为0 、1 、2 、3 、4 、5 、6 、7 、8 、9, 可以用"e 起始地址 数据 数据 数据 ……"的格式来进行

b48d34b505d3d6924fd7a5723faca403_219833389a2ddea41350f7473d866cf3.png


也可以采用提问的方式来一个一个地改写内存中的内容

-e 命令向内存中写入字符


Debug 对E 命令的执行结果是,向1000:0 、1000:2 、1000:4 单元中写入数值1 、2 、3' 向1000 : 1 、1000:3 、1000 : 5 单元中写入字符" a" 、"b" 、" C" 的ASCII 码值: 61H 、62H 、63H 。


-e 命令将机器码写入内存

比如我们要从内存1000:0 单元开始写入这样一段机器码:


机器码 对应的汇编指令

b80100 mov ax ,0001b90200 mov cx ,000201c8 add ax, cx


-u命令查看内存中的内容

-u命令将内存单元中的内容翻译为汇编指令显示

使用U 命令。比如可以用U 命令将从1000 : 0 开始的内存单元中的内容翻译为汇编指令,并显示出来


-t命令可以执行一条或多条指令

简单地使用T 命令,可以执行CS :IP 指向的指令

-a命令以汇编指令的形式在内存中写入机器指令

用A 命令向从1000:0 开始的内存单元中写入指令


首先用A 命令,以汇编语言向从1000:0 开始的内存单元中写入了几条指令,然后用D 命令查看A 命令的执行结果。可以看到,在使用A 命令写入指令时,我们输入的是汇编指令, Debug 将这些汇编指令翻译为对应的机器指令,将它们的机器码写入内存。

23b03784d684b3b466937da46a4785e7_c77b744d0546db2c73e7e29716fa1890.png


实验任务

  1. 使用下面3条指令写入2000:0开始的内存单元中,利用这3条指令计算2的8次方。
mov ax,1add ax,axjmp 2000:0003

修改CS:IP——CPU当前要读取指令的地址

-t 执行当前CS:IP处指令 并且观察CS:IP变化


  1. PC主板上的ROM中有个一出产日期,在内存FFF00H-FFFFFH的某几个单元中,请找到这个出产日期并试图改变它。


地址在FFFF0=FFFF*16+0; FFFFF=FFFF*16+F


用debug如下:


-d ffff:0 f

FFFF:0000 EA 5B E0 00 F0 (date here...)


相关文章
|
12月前
|
缓存 安全 Java
Java并发编程进阶:深入理解Java内存模型
Java并发编程进阶:深入理解Java内存模型
83 0
|
3月前
|
存储 缓存 Java
【高薪程序员必看】万字长文拆解Java并发编程!(5):深入理解JMM:Java内存模型的三大特性与volatile底层原理
JMM,Java Memory Model,Java内存模型,定义了主内存,工作内存,确保Java在不同平台上的正确运行主内存Main Memory:所有线程共享的内存区域,所有的变量都存储在主存中工作内存Working Memory:每个线程拥有自己的工作内存,用于保存变量的副本.线程执行过程中先将主内存中的变量读到工作内存中,对变量进行操作之后再将变量写入主内存,jvm概念说明主内存所有线程共享的内存区域,存储原始变量(堆内存中的对象实例和静态变量)工作内存。
123 0
|
2月前
|
存储 缓存 程序员
软考软件评测师——计算机组成与体系结构(CPU指令系统)
本内容详细解析了计算机中央处理器(CPU)的核心架构及其关键组件的工作原理。首先介绍了CPU的四大核心模块:运算单元、控制单元、寄存器阵列和内部总线,并阐述其在数据处理中的核心职责。接着深入探讨了算术逻辑部件(ALU)的功能与专用寄存器的作用,以及通用寄存器对性能提升的意义。随后分析了控制单元的指令处理流程及特殊寄存器的功能。此外,还解析了寄存器系统的分类与设计特点,并对比了不同内存访问模式的特点与应用场景。最后,通过历年真题巩固相关知识点,帮助理解CPU各组件的协同工作及优化策略。
|
10月前
CPU的工作原理基于其内部结构,通过执行指令来完成各种任务
CPU的工作原理基于其内部结构,通过执行指令来完成各种任务
250 2
|
5月前
|
分布式计算 算法 Java
|
9月前
|
存储 人工智能 编译器
【AI系统】CPU 指令集架构
本文介绍了指令集架构(ISA)的基本概念,探讨了CISC与RISC两种主要的指令集架构设计思路,分析了它们的优缺点及应用场景。文章还简述了ISA的历史发展,包括x86、ARM、MIPS、Alpha和RISC-V等常见架构的特点。最后,文章讨论了CPU的并行处理架构,如SISD、SIMD、MISD、MIMD和SIMT,并概述了这些架构在服务器、PC及嵌入式领域的应用情况。
588 5
|
11月前
|
监控 算法 Java
深入理解Java中的垃圾回收机制在Java编程中,垃圾回收(Garbage Collection, GC)是一个核心概念,它自动管理内存,帮助开发者避免内存泄漏和溢出问题。本文将探讨Java中的垃圾回收机制,包括其基本原理、不同类型的垃圾收集器以及如何调优垃圾回收性能。通过深入浅出的方式,让读者对Java的垃圾回收有一个全面的认识。
本文详细介绍了Java中的垃圾回收机制,从基本原理到不同类型垃圾收集器的工作原理,再到实际调优策略。通过通俗易懂的语言和条理清晰的解释,帮助读者更好地理解和应用Java的垃圾回收技术,从而编写出更高效、稳定的Java应用程序。
|
11月前
|
存储 并行计算 算法
CUDA统一内存:简化GPU编程的内存管理
在GPU编程中,内存管理是关键挑战之一。NVIDIA CUDA 6.0引入了统一内存,简化了CPU与GPU之间的数据传输。统一内存允许在单个地址空间内分配可被两者访问的内存,自动迁移数据,从而简化内存管理、提高性能并增强代码可扩展性。本文将详细介绍统一内存的工作原理、优势及其使用方法,帮助开发者更高效地开发CUDA应用程序。
|
11月前
|
缓存 Linux C语言
C语言 多进程编程(六)共享内存
本文介绍了Linux系统下的多进程通信机制——共享内存的使用方法。首先详细讲解了如何通过`shmget()`函数创建共享内存,并提供了示例代码。接着介绍了如何利用`shmctl()`函数删除共享内存。随后,文章解释了共享内存映射的概念及其实现方法,包括使用`shmat()`函数进行映射以及使用`shmdt()`函数解除映射,并给出了相应的示例代码。最后,展示了如何在共享内存中读写数据的具体操作流程。
|
12月前
|
存储 程序员
揭秘汇编语言基础命令:掌握底层编程秘籍,你准备好挑战硬件的直接对话了吗?
【8月更文挑战第22天】大家好,今天分享汇编语言基础命令。汇编语言直接与硬件交互,高效而底层。对理解计算机原理至关重要。本文以x86架构为例,介绍环境搭建、数据定义、寄存器操作、算术运算及控制流指令。通过示例程序实现1至10的累加,展示基础命令的实际应用。虽然学习曲线陡峭,但掌握后能深刻理解计算机工作原理。一起来探索汇编语言的魅力吧!
136 3