当前位置: 首页 > news >正文

汇编语言实验一

本次实验中需要用到的命令:

  • - R:查看和修改 CPU 中寄存器的内容
  • - D:查看内存中的内容
  • - E:修改内存中的内容(可以写入数据或者指令,在内存中,它们实际上没有区别)
  • - U:将内存单元中的内容翻译为机器指令和汇编指令
  • - T:执行 CS:IP 指向的内存单元处的指令
  • - A:以汇编指令的形式向内存中写入指令

 实验任务:

(一)使用 Debug,将下面的程序段写入内存,逐条执行,并观察每条指令执行后 CPU 相关寄存器的内容变化

  • B8 20 4E  -----------------------   mov ax,4E20H
  • 05 16 14   -----------------------   add ax,1416H
  • BB 00 20  -----------------------   mov bx,2000H
  • 01 D8       -----------------------   add ax,bx
  • 89 C3       -----------------------   mov bx,ax
  • 01 D8       -----------------------   add ax,bx
  • B8 1A 00  -----------------------   mov ax,001AH
  • BB 26 00  -----------------------   mov bx,0026H
  • 00 D8       -----------------------   add al,bl
  • 00 DC      -----------------------   add ah,bl
  • 00 C7      -----------------------    add bh,al
  • B4 00      -----------------------    mov ah,0
  • 00 D8      -----------------------    add al,bl
  • 04 9C      -----------------------    add al,9CH

可以使用 E 命令或者 A 命令向内存中写入指令。注意用 T 命令执行的时候, CS:IP 的指向。

其中 E 命令是写入机器码,A 命令写入汇编指令。

上面总共有 14 条指令,其中前 7 条指令我使用 E 命令写入内存,后 7 条指令使用 A 命令写入内存。

下面是动图演示向内存中输入指令的过程:

可以看到我在使用汇编指令的方式输入的时候,第一条指令输入 mov bx,0026H 报错了,是因为向 8086PC 机内存输入指令的时候,默认使用的是 16 进制,所以不需要在指令中指明。

下面动图演示使用 T 命令执行上述写入的各条指令,注意内存中寄存器的内容变化,特别是 CS 和 IP 的内容是如何变化的。

可是看到为了执行我们输入内存中的指令,首先我将 CS 的值置为 1000H,然后将 IP 的值置为 0000H,这下 CPU 接下来执行的第一条指令就是从内存单元的 1000:0 开始。

然后我使用了 14 个 T 命令,完成了指令的执行,在执行过程中可以仔细注意各个相关寄存器内容的变化。

(二)将下面 3 条指令写入从 2000:0 开始的内存单元中,利用这 3 条指令计算 2 的 8 次方

  • mov ax,1
  • add ax,ax
  • jmp 2000:0003

 将指令写入内存后,执行 T 命令,直到 AX 中的值为 0100H。

动图演示如下:

首先写入指令后,照样是将 CS:IP 的值设置为 2000:0,即第一条需要执行的指令地址。

然后输入 T 指令执行,这道题使用了 jmp 这条汇编指令,例如 jmp 2000:0003 即是将 CS 中的值置为 2000H ,IP 中的值置为 0003H。

这样我们在指令执行的过程中没有去主动的修改过 CS:IP 的值,而是通过内存单元中的一条指令来完成的。

(三)查看内存的内容

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

使用 D 命令去内存中的相关区域查看,动图演示如下:

首先用 D 命令查看了这段生产日期为 06 / 23 / 99 且内存地址单元为 ffff:5 ~ ffff:c

然后我使用 E 命令向该段内存中写入 8 个字节,试图修改这段内存的内容。

点击确认后再次查看该段内存的内容还是没变,说明了ROM 中的内容是不可改变的。

下面是 8086PC 机内存地址空间分配情况:

(四)向内存从 B8100H 开始的单元中填写数据

如:B810:0000 01 01 02 02 03 03 04 04 

请读者先填写不同的数据,观察产生的现象;再改变填写的地址,观察产生的现象。

动图演示如下:

明显观察到图中右上方出现了变化,当输入不同数据时,出现的图形和颜色也不同。

这说明了上面那个内存起始地址是处于显存的范围,向里面写入数据其实是在向显存中写入数据,显卡再将显存中的数据输出到屏幕上。

(完)

转载于:https://www.cnblogs.com/KKSJS/p/9942050.html

相关文章:

  • 深入理解java虚拟机(六)字节码指令简介
  • 蛇形矩阵
  • oracle查看执行最慢与查询次数最多的sql语句
  • js轮播
  • 指针函数与函数指针的区别
  • IntelliJ IDEA 配置JDK
  • Jmeter (八) 脚本增强_事物
  • 为django项目配置celery的后台启动
  • 用Python表达对Android的想法
  • vue页面与状态机,一些设想与实践
  • KVM web管理工具——WebVirtMgr(一)
  • 关于字符串格式化
  • 在小程序中打开普通二维码
  • 网站资源【珍藏版】
  • 四则运算
  • 「面试题」如何实现一个圣杯布局?
  • 08.Android之View事件问题
  • 77. Combinations
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Docker入门(二) - Dockerfile
  • Docker下部署自己的LNMP工作环境
  • exif信息对照
  • Fundebug计费标准解释:事件数是如何定义的?
  • mongo索引构建
  • ReactNativeweexDeviceOne对比
  • Spring核心 Bean的高级装配
  • SpriteKit 技巧之添加背景图片
  • VUE es6技巧写法(持续更新中~~~)
  • 测试开发系类之接口自动化测试
  • 关于extract.autodesk.io的一些说明
  • 回顾2016
  • 记一次和乔布斯合作最难忘的经历
  • 时间复杂度与空间复杂度分析
  • 我从编程教室毕业
  • 我建了一个叫Hello World的项目
  • 小李飞刀:SQL题目刷起来!
  • 主流的CSS水平和垂直居中技术大全
  • 06-01 点餐小程序前台界面搭建
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • Spring Batch JSON 支持
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​ubuntu下安装kvm虚拟机
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • $NOIp2018$劝退记
  • (1)STL算法之遍历容器
  • (2)STM32单片机上位机
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (数据结构)顺序表的定义
  • (四)Controller接口控制器详解(三)
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (原創) 未来三学期想要修的课 (日記)
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一