(四)《汇编语言(王爽)》 | 检测点 3.1、3.2

2024-01-05 18:08

本文主要是介绍(四)《汇编语言(王爽)》 | 检测点 3.1、3.2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1. 检测点 3.1
  • 2. 检测点 3.2


1. 检测点 3.1

(1)使用 d 指令查看 0000:0000~0000:001F 的内存值,并写出每条汇编指令执行完后相关寄存器中的值。

  • 8086CPU 中的 DS 寄存器用于存放将要访问数据的段地址(CS 用于存放代码地址),mov、sub、add 指令可实现寄存器和内存单元(使用中括号)之间值的操作。如,mov al,[0] 将段地址为 DS、偏移地址为 0 的内存单元数据送入 al 寄存器中,DS 的计算公式同 CS:IP。

  • 8086CPU 不支持直接将数据送入段寄存器中,如 mov ds,1000 错误,而需要使用使用其他寄存器周转,如 mov ax,1000 mov ds,ax。

首先,假如使用 d 指令查看 0000:0000~0000:001F 内存单元的值为:

0000:0000 70 80 F0 30 EF 60 30 E2-00 80 80 12 66 20 22 60
0000:0010 62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88

每条汇编执行执行完成后相关寄存器中的值为:

指令AXBXDS
mov ax,1000100000000
mov ds,ax000100000001
mov ax,[0000]266200000001
mov bx,[0001]2662E6260001
mov ax,bxE626E6260001
mov ax,[0000]2662E6260001
mov bx,[0002]2662D6E60001
add ax,bxFD48D6E60001
add ax,[0004]2C14D6E60001
mov ax,00000D6E60001
mov al,[0002]00E6D6E60001
mov bx,000E600000001
mov bl,[000C]00E600260001
add al,bl000C00260001

注:上述黑体部分中,低位的运算没有影响到高位。

(2)内存中的情况如下图:
在这里插入图片描述
各寄存器的初值为:CS=2000H、IP=0、DS=1000H、AX=0、BX=0。

① 使用汇编代码写出 CPU 执行的指令序列。
② 写出 CPU 每条指令执行后,相关寄存器中的数值。
③ 程序和数据的区别。

  • CPU 从 CS:IP 处开始执行指令,执行完每条指令后,IP 的值加上上一条指令的长度。
  • 使用 jmp 指令修改 CS:IP 的值,jmp 段地址:偏移地址,如 jmp 2AE3:3 后,CS=2AE3H、IP=0003H,并且 CPU 将从 2AE3:3 处读取指令并执行;或 jmp 某一合法寄存器名,如 jmp AX 后,IP=AX。

CPU 总是从 CS(2000H):IP(0) 处开始执行指令:

指令AXBXCSIPDS
mov ax,6622H66220000200000031000
jmp 0ff0:0100H66220000100000001000
mov ax,2000H20000000100000031000
mov ds,ax20000000100000052000
mov ax,[0008]C1890000100000082000
mov ax,[0002]EA6600001000000B2000

注意,上述黑体部分是将内存单元中的值送入寄存器内,中括号内指明了内存单元的偏移地址,段地址由 DS 寄存器的内容决定。不同的 CS:IP 组合可能指向同一内存地址,如上述表格第二行将 CS=0FF0、IP=0100 写作 CS=1000、IP=0000,它们都执行内存单元 10000。

总结:寄存器 CS 和 IP 控制 CPU 执行指令的顺序,寄存器 DS 配合偏移地址指明数据存放的位置。


2. 检测点 3.2

(1)补全程序,使其可以将 10000H~1000FH 中的 8 个字逆序拷贝到 20000H~2000FH 中。

  • 栈是一种具有后进先出(LIFO)性质的数据结构。
  • 8086CPU 中入栈(push)和出栈(pop)操作都以字(两个字节)为单位,使用 SS:SP (和 CS:IP 指示指令位置类似)来指示栈顶的位置。栈顶从高地址往低地址方向增长,即入栈时 SP 的值减小、出栈时 SP 的值增大
  • 在栈为空时,SS:SP 指向栈空间最高地址单元的下一单元
  • 栈顶超界可能导致其他内存单元数据被更改而产生意向不到的情况,8086CPU 不提供限制栈顶超界的情况。
  • push 和 pop 指令后可接寄存器或以中括号表示的内存单元(结合 DS 寄存器)的值。
mov ax,1000H
mov ds,ax
________	;mov ax,2000H
________	;mov ss,ax
________	;mov sp,0010H
push [0]
push [2]
push [4]
push [6]
push [8]
push [A]
push [C]
push [E]
  • 最后几条指令往栈内压入数据,根据题意是将数据压入内存 20000H~2000FH 内。前面已经设定好 DS 寄存器的值为 1000,所以 push [0] 操作的数据是 1000:0,后面类似。
  • 所以,前面需先设定 SS:SP 的值,由于栈顶从高地址往低地址增长,所以初始时 SS=2000、SP=0010 表示栈空状态。由于 8086CPU 不支持将数据直接送放入段寄存器,而需要通过另一个寄存器周转,所以三条指令完成 SS 和 SP 指令的复制。

(2)补全程序,使其可以将 10000H~1000FH 中的 8 个字逆序拷贝到 20000H~2000FH 中。

mov ax,2000H
mov ds,ax
________	;mov ax,1000H
________	;mov ss,ax
________	;mov sp,0000H
pop [E]
pop [C]
pop [A]
pop [8]
pop [6]
pop [4]
pop [2]
pop [0]
  • 这题要求和上一题一样,上一题使用的是 push 指令,这道题使用 pop 指令,如 pop [E] 将栈顶元素送入内存单元 [E] 内并移动栈顶指针。内存单元的偏移地址为 000E,段地址由寄存器 DS 决定。
  • 题目前两条指令已经设定好 DS 寄存器的值,和上一题类似,中间三条指令的功能是设定好 SS:SP 的值,所以初始时 CS=1000、SP=0000 表示栈满状态使得出栈元素依次放入 2000FH~20000H 中。

这篇关于(四)《汇编语言(王爽)》 | 检测点 3.1、3.2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

JavaEE7 Servlet 3.1(JSR 340)规范中文版

http://www.iteye.com/news/27727-jinnianshilongnian     Jave EE 7中的部分规范已正式获得批准通过,其中包括JSR340 Java Servlet 3.1规范,去年翻译了该规范,在此分享出来,希望对某些朋友有所帮助,不足之处请指正。   点击直接下载    在线版目录   Servlet3.1规范翻译

汇编语言知识基础介绍

汇编语言是一种低级编程语言,直接与计算机硬件的指令集架构(ISA)对应。它在操作系统、设备驱动程序和性能关键的应用程序中起着重要作用。以下是汇编语言的基础介绍: 1. 基本概念 指令集架构(ISA):汇编语言与特定的处理器架构(如 x86、ARM)对应,每种架构有其特定的指令集。汇编指令:汇编语言的语法是处理器指令的符号表示,通常包括操作码(opcode)和操作数。操作码指定操作的类型,操作数

Llama 3.1大模型的预训练和后训练范式解析

Meta的Llama大型语言模型每次出新版本,都会是一大事件。前段时间他们不仅发布了3.1的一个超大型的405亿参数模型,还对之前的8亿和70亿参数的模型做了升级,让它们在MMLU测试中的表现更好了。 不同模型在MMLU基准测试中的表现 他们还出了一个92页的技术报告《Llama 3 Herd of Models》(https://arxiv.org/abs/2407.21783),里

[编程之美] 3.1 字符串循环移位包含

题目 s1 = AABCD, s2 = CDAA Return : true 给定两个字符串 s1 和 s2,要求判定 s2 是否能够被 s1 做循环移位得到的字符串包含。 思路 以S1 = ABCD 为例,对其循环移位的后果为: ABCD -> BCDA -> CDAB -> DABC -> ABCD S1S1 = ABCDABCD 看出对S1做循环移位所得到的字符串都将是字符串S1S1的

汇编语言输出“Hello World!“

1.软件 Nasmide64.exe(李忠老师编写) Fixvhdw64.exe(李忠老师编写) VirtualBox虚拟机(免费 开源) 2.过程 01.Fixvhdw64.exe输入以下代码: mov ax,0xb800mov ds,axmov byte [0x00],'H'mov byte [0x02],'e'mov byte [0x04],'l'mov byte [0

USACO Section 3.1 Humble Numbers

题意: 已知一个集合S  由S的任意子集作为因子  可构造出一个数字  求  这些构造出的数字中第k大的数字是多少 思路: 拿到这题就被“数字不是很多而且比较连续暴力枚举就好”这个思路迷惑了  果断TLE… 跪了一次后想到通过bfs构造可取  这时用了queue维护bfs  用priority_queue维护答案(大顶堆  内部最多k个数字)  用set判重复(5*2=2*5)  写

[3.2] 机器人连杆变换和运动学方程

本节首先推导相邻两连杆坐标系之间的变换矩阵,然后将这些变换矩阵依次相乘,得到操作臂的运动学方程。该方程表示末端连杆相对于基座的位姿关系,是各关节变量的函数。 连杆坐标系{i}与{i-1}通过四个参数、、、联系起来,因此坐标系{i}相对于{i-1} 的齐次变换矩阵T,通常也是连

ARM——结构体系(处理器工作模式,CPSR,立即数,汇编语言函数调用)

1、处理器工作模式          ARM有7个基本工作模式:User:非特权模式,大部分任务执行在这种模式FIQ:当一个高优先级(fast)中断产生时将会进入这种模式IRQ:当一个低优先级(normal)中断产生时将会进入这种模式Supervisor:当复位或软中断指令执行时将会进入这种模式Abort:当存取异常时将会进入这种模式Undef:当执行未定义指令时会进入这种模式Sy

ARM下汇编语言编程

一、ARM汇编语言程序格式 ARM汇编语言是以段(section)为单位来组织源文件的。段是相对独立的、具有特定名称的、不可分割的指令或者数据序列。 段又可以分为代码段和数据段,代码段存放执行代码,数据段存放代码运行时需要用到的数据。一个ARM源程序至少需要一个代码段,大的程序可以包含多个代码段和数据段。 二、ARM汇编语言中常用的伪操作 例如: area reset,cod