《汇编语言》- 读书笔记 - 各章检测点归档

《汇编语言》- 读书笔记 - 各章检测点归档

  • 检测点 1.1
  • 检测点 2.1
  • 检测点 2.2
  • 检测点 2.3
  • 检测点 3.1
  • 检测点 3.2
  • 检测点 6.1
  • 检测点 9.1

检测点 1.1

  1. 1个CPU 的寻址能力为8KB,那么它的地址总线的宽度为     13     
    解:8KB = 8192B= 213

  2. 1KB的存储器有     1024     个存储单元。存储单元的编号从     0          1023     
    解:一个存储单元可以存储一个Byte。 1KB = 1024B。从 0 开始算所以是 0到1023共1024个。

  3. 1KB 的存储器可以存储     2^13=8192     个bit,     2^10=1024     个 Byte。
    解:8bit=1Byte,1024Byte=1KB。
    1KB = 1bit * 8 * 1024 = 8192bit
    1KB = 1Byte * 1024 = 1024Byte

  4. 1GB1MB1KB分别是     1,073,741,8241,048,5761024     Byte。
    解:230=1,073,741,824; 220=1,048,576; 210=1024

  5. 808080888028680386 的地址总线宽度分别为16根20根24根32根,则它们的寻址能力分别为:     64     (KB)、     1     (MB)、     16     (MB)、     4     (GB)
    解:寻址能力 = 2(地址总线宽度) (CPU地址总线宽度,决定了它最多可以访问多大的内存地址范围。也就是它的寻址能力。
    216-10=64;(B转KB:16-10,最终 26=64)
    220-20=1; (B转KB:20-10,KB转MB:10-10,最终 20=1)
    224-20=16;(B转KB:24-10,KB转MB:14-10,最终 24=16)
    232-30=4; (B转KB:32-10,KB转MB:22-10,MB转GB:12-10,最终 22=4)

  6. 8080808880868028680386 的数据总线宽度分别为8根8根16根16根32根。则它们一次可以传送的数据为:   1   (B)、   1   (B)、   2   (B)、   2   (B)、   4   (B)。
    解:一根总线要么传高电平1,要么传低电平0,有几线就能同时传几个bit
    8bit = 1Byte

  7. 从内存中读取1024字节的数据,8086至少要读   512   次,80386至少要读   256   次。
    解:8086数据总线宽度16,一次传2B,1024 / 2 = 512
    80386数据总线宽度32,一次传4B,一次传2B,1024 / 4 = 256

  8. 在存储器中,数据和程序以     二进制     形式存放。

检测点 2.1

  1. 写出每条汇编指令执行后相关寄存器中的值。
汇编指令指令执行后相关寄存器中的值说明
mov ax, 62627AX= F4A3H62627 转16进制=F4A3H
mov ah, 31HAX=31A3H修改AX的高8位为 31H
mov al, 23HAX=3123H修改AX的低8位为 23H
add ax, axAX=6246H3123 + 3123 = 6246H
mov bx, 826CHAX=6246H, BX=826CH
mov cx, axAX=6246H, BX=826CH, CX=6246H
mov ax, bxAX=826CH, BX=826CH, CX=6246H
add ax, bxAX=04D8H, BX=826CH, CX=6246H
mov al, bhAX=0482H, BX=826CH, CX=6246H修改 ax 的低8位 = bx 的高8位
mov ah, blAX=6C82H, BX=826CH, CX=6246H修改 ax 的高8位 = bx 的低8位
add ah, ahAX=D882H, BX=826CH, CX=6246Hax 高8位相加: 6C + 6C = D8H
add al, 6AX=D888H, BX=826CH, CX=6246Hax 低8位 + 6:82 + 6 = 88H
add al, alAX=D810H, BX=826CH, CX=6246Hax 低8位相加:88 + 88 = 110H
0001 0001 0000高4位溢出丢失。ax = 10H
mov ax, cxAX=6246H, BX=826CH, CX=6246H
  1. 只能使用目前学过的汇编指令,最多使用 4条指令,编程计算 2的4次方。
指令ax值
mov ax, 22
add ax, ax2+2=4
add ax, ax4+4=8
add ax, ax8+8=16

检测点 2.2

  1. 给定段地址为 0001H,仅通过变化偏移地址寻址,CPU 的寻址范围为   00010H      1000FH   
    解:物理地址 = 段地址 x 16 + 偏移地址偏移地址的范围是从 0000FFFF
    0001H * 16 = 00010H。此CPU的寻址范围是 00010H + 0000H00010H + FFFFH = 00010H1000FH

  2. 有一数据存放在内存 20000H 单元中,现给定段地址为 SA,若想用偏移地址寻到此单元。则 SA 应满足的条件是: 最小为   1001H   ,最大为   2000H   
    提示,反过来思考一下,当段地址给定为多少,CPU 无论怎么变化偏移地址都无法寻到 20000H单元?
    解:

步骤SA 最小SA 最大
1min * 16 + FFFFH = 20000Hmax * 16 + 0000H = 20000H
2min * 16 = 20000H - FFFFH (偏移地址最大时,段地址最小)max * 16 + 0000H = 20000H
3min = 10001H ÷ 16max = 20000H ÷ 16
4min = 0001 0000 0000 0000 0001B >> 4max = 0010 0000 0000 0000 0000B >> 4
5min = 0001 0000 0000 0000. 0001Bmax = 0000 0010 0000 0000 0000B
6min = 1000.1H
(我靠除不尽。根物理地址计算公式,可知段地址必是个整数)
max = 2000H (得到最大值)
7倒回第2步,我们调整一下 20000H - FFFFH 的结果,让它能被16整除。
如何调整呢?分析:
已知:20000H是题目给定的条件,不能动。只能调FFFFH
同时FFFFH已经是偏移地址最大值,尝试的方向只有减小它。
FFFFH减多10001H就往上涨多少。调到能整除16为止。
那么看一下10001H加多少能被16整除呢?
直接看2进制,除以16就是右移4位
10001H = 0001 0000 0000 0000 0001B
最近一个>>4不丢精度的数是: 0001 0000 0000 0001 0000B = 10010H
10010H - 10001H = 0000FH
所以偏移量的最大值应该是:FFFFH - 000FH = FFF0H
分析完毕,开始计算
8min * 16 = 20000H - FFF0H
9min = 10010H ÷ 16
10min = 1001H (得到最小值)

FFF0H 的过程,穷举一下更直观

="20000H - "&DEC2HEX(65536-ROW())&"H"	=	=DEC2HEX(E1)&"H"	|	=131072-65536+ROW()	|	=E1&" ÷ 16 = "&E1/16
减小偏移地址十进制检查整除
20000H - FFFFH = 10001H6553765537 ÷ 16 = 4096.0625
20000H - FFFEH = 10002H6553865538 ÷ 16 = 4096.125
20000H - FFFDH = 10003H6553965539 ÷ 16 = 4096.1875
20000H - FFFCH = 10004H6554065540 ÷ 16 = 4096.25
20000H - FFFBH = 10005H6554165541 ÷ 16 = 4096.3125
20000H - FFFAH = 10006H6554265542 ÷ 16 = 4096.375
20000H - FFF9H = 10007H6554365543 ÷ 16 = 4096.4375
20000H - FFF8H = 10008H6554465544 ÷ 16 = 4096.5
20000H - FFF7H = 10009H6554565545 ÷ 16 = 4096.5625
20000H - FFF6H = 1000AH6554665546 ÷ 16 = 4096.625
20000H - FFF5H = 1000BH6554765547 ÷ 16 = 4096.6875
20000H - FFF4H = 1000CH6554865548 ÷ 16 = 4096.75
20000H - FFF3H = 1000DH6554965549 ÷ 16 = 4096.8125
20000H - FFF2H = 1000EH6555065550 ÷ 16 = 4096.875
20000H - FFF1H = 1000FH6555165551 ÷ 16 = 4096.9375
20000H - FFF0H = 10010H6555265552 ÷ 16 = 4097

反过来思考一下:段地址小于 1001H 或 大于2000H时,CPU无论怎么变化偏移地址都无法寻到 20000H单元。

检测点 2.3

下面的 3 条指令执行后,CPU 几次修改 IP? 都是在什么时候? 最后 IP 中的值是多少?

mov ax, bx
sub ax, ax
jmp ax

解:
mov 指令将bx中的数据送到ax中。指令本身不会修改IP
sub 指令将两个操作数的相减,即从op1中减去op2,其结果放在op1中。指令本身不会修改IP
jmp 指令将无条件地控制程序转移到目的地址去执行。jmp 指令会修改IP
jmp ax 将 ax 的值传给 ip

  1. 总共 IP 被 修改了4 次。
  2. 读取每条指令后IP修改一次一起3次,执行 jmp ax 会修改 IP 1次。
  3. 最后 IP 中的值是   0    (因为 sub ax, ax 后 ax 的值就是 0 了)
    在这里插入图片描述

检测点 3.1

    1. 在Debug中,用d 0:0 1F查看内存,结果如下:
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

下面的程序执行前,AX=0,BX=0,写出每条汇编指令执行完后相关寄存器中的值。

解:
在这里插入图片描述

指令寄存器值
mov ax, 1
mov ds, ax
mov ax, [0000]AX=2662
mov bx, [0001]BX=E626
mov ax, bxAX=E626
mov ax, [0000]AX=2662
mov bx, [0002]BX=D6E6
add ax, bxAX=FD48
add ax, [0004]AX=2C14
mov ax, 0AX=0000
mov al, [0002]AX=00E6
mov bx, 0BX=0000
mov bl, [000C]BX=0026
add al, blAX=000C
    1. 内存中的情况如图 3.6 所示。
      各寄存器的初始值: CS=2000H,IP=0,DS=1000H,AX=0,BX=0;
  1. 写出 CPU 执行的指令序列(用汇编指令写出)。
  2. 写出 CPU 执行每条指令后,CS、IP 和相关寄存器中的数值。
  3. 再次体会: 数据和程序有区别吗?如何确定内存中的信息哪些是数据,哪些是程序?

在这里插入图片描述

解:

指令CSIPDSAXBX
开始20000000100000000000
mov ax, 6622H00036622
jmp 0ff0:010010000000
mov ax, 2000H00032000
mov ds, ax00052000
mov ax, [0008]0008C389
mov ax, [0002]000BEA66
结束1000000B2000EA660000

数据程序在内存中都是机器码没有区别。
CS:IP 指向的就当指令用。
DS:[addr]指向就当数据用。

检测点 3.2

  1. 补全下面的程序,使其可以将 10000H~1000FH 中的 8 个字,逆序复制到20000H~2000FH中。逆序复制的含义如图 3.17 所示(图中内存里的数据均为假设)。

在这里插入图片描述

mov ax, 1000H
mov ds, ax
mov ax, 2000H	; 设置栈段地址
mov ss, ax
mov sp, 0010H	; sp指向空栈时的位置
push [0]
push [2]
push [4]
push [6]
push [8]
push [A]
push [B]
push [C]
  1. 补全下面的程序,使其可以将 10000H~1000FH中的 8 个字,逆序复制到20000H~2000FH中。
mov ax, 2000H
mov ds, ax
mov ax, 1000H
mov ss, ax
mov sp, 0000H	; 栈顶指向 1000:0000 礼成
pop [E]
pop [C]
pop [B]
pop [A]
pop [8]
pop [6]
pop [4]
pop [2]
pop [0]

检测点 6.1

  1. 下面的程序实现依次用内存 0:0~0:15 单元中的内容改写程序中的数据,完成程序:
assume cs:code
code segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h	; cs:0~15start:	mov ax, 0mov ds, ax		mov bx, 0mov cx, 8s:	mov ax:[bx]	mov cs:[bx], ax		; 将数据逐个送到 cs:[0]到 cs:[15]add bx, 2loop s		mov ax, 4c00h		int 21h
code ends
end start
  1. 下面的程序实现依次用内存 0:0~0:15 单元中的内容改写程序中的数据,数据的传送用栈来进行。栈空间设置在程序内。完成程序:
assume cs:code
code segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h	; cs:00~0Fdw 1,2,3,4,5,6,7,8,9,10								; cs:10~23
start:	mov ax, cs		; 栈段就是代码段mov ss, ax		mov sp, 24h		; 指向栈顶 cs:22 + 2mov ax, 0mov ds, axmov bx, 0mov cx, 8s:	push [bx]	pop cs:[bx]		; 数据出栈就送到 cs:[0]到 cs:[15]add bx, 2loop s		mov ax, 4c00h		int 21h
code ends
end start

在这里插入图片描述
这里用栈做中转,其实只要一个字(16)字节的空间就够了。

检测点 9.1

  1. 程序如下
assume cs:codedata segment?
data endscode segmentstart:	mov ax,datamov ds,axmov bx,0jmp word ptr [bx+1]
code ends
end start

若要使程序中的 jmp 指令执行后,CS:IP 指向程序的第一条指令,在 data 段中应该定义哪些数据?
解:

assume cs:codedata segmentdb 00				; data 段的第1个字节,值随意dw offset start		; data 段的第2、3两个字节保存标号 start 的偏移地址
data endscode segmentstart:	mov ax,datamov ds,axmov bx,0jmp word ptr [bx+1]	; bx 的值是 0 ,所以最终从 ds:[1] 处读偏移地址。长度 1 word 
code ends
end start

分析:
jmp word ptr 从指定内存处读取一个,修改偏移地址IP
jmp word ptr [bx+1][bx+1] 实际值为 [1],表示从数据段的第2、3两个字节读取偏移地址 修改 IP
所以只要取得标号 start 的偏移地址存在 ds:[1] - ds:[2] 即可。
我上面用的是 offset start 获取偏移地址。但是我们知道 start 是代码的入口偏移是 0,所以直接写死也是可以的。

在这里插入图片描述

jmp word ptr [bx+1] 执行后 IP 修改成功。

  1. 程序如下
assume cs:codedata segmentdd 12345678H
data endscode segmentstart:	mov ax,datamov ds,axmov bx,0mov [bx],_____mov [bx+2],_____jmp dword ptr ds:[0]
code ends
end start

补全程序,使 jmp 指令执行后,CS:IP 指向程序的第一条指令
解:

assume cs:codedata segmentdd 12345678H
data endscode segmentstart:	mov ax,datamov ds,axmov bx,0mov [bx], offset start	; 取偏移地址存到 ds:[0]mov [bx+2], code		; 取段地址存到 ds:[2]jmp dword ptr ds:[0]
code ends
end start

分析:
jmp dword ptr 从指定内存处读取一个双字,修改CS:IP
data 中声明了内存空间,给 jmp 用。但值 12345678H 不是我们想要的。
正好留空的两处,供我们修改这段内存:
mov [bx], offset start:取偏移地址存到 ds:[0]
mov [bx+2], code:取段地址存到 ds:[2]

在这里插入图片描述

  1. 用 Debug 查看内存,结果如下:
    2000:1000 BE 00 06 00 00 00 .....
    则此时,CPU 执行指令:
mov ax,2000H
mov es,ax
jmp dword ptr es:[1000H]

后,(CS)=?,(IP)=?

解:
es:[1000H] 实际对应的内存位置是 2000H:1000H,也就是上面 Debug 查看的那段。
dword 是双字,所以对应 BE 00 06 00 这段。
(CS)=0006,(IP)=00BE

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/669383.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

构建高效直播美颜系统:美颜SDK集成与性能优化指南

如今,美颜技术的广泛应用成为各类直播平台的标配之一。今天,小编将与大家进一步讨论如何构建高效的直播美颜系统,重点关注美颜SDK的集成和性能优化方面。 一、美颜SDK的选择与集成 选择合适的美颜SDK是构建高效直播美颜系统的第一步。不同的…

MATLAB频域分析(附完整代码)

1. MATLAB进行频域分析举例 以下是一个使用MATLAB进行频域分析的例子。在这个例子中,我们将生成一个含有两个不同频率分量的信号,然后使用快速傅里叶变换(FFT)来分析其频域特性。 main.m文件 clc;close all;clear all;warning of…

12. onnx转为rknn测试时有很多重叠框的修改(python)

我们下载rknn-toolkit2-master后并进行前面的处理后,进入到rknn-toolkit2-master\examples\onnx\yolov5文件夹,里面有个test.py文件,打开该文件,其代码如下: # -*- coding: utf-8 -*- # coding:utf-8import os import…

msvcp120.dll丢失如何解决/找不到msvcp120.dll的5种有效的解决方法

在计算机系统运行过程中,如果遇到“找不到msvcp120.dll”的提示信息,这代表了何种具体状况呢?首先,我们需要明确msvcp120.dll文件的重要性。msvcp120.dll是Microsoft Visual C Redistributable Package的一部分,这是一…

工作与生活平衡:在生活中寻找和谐

工作和生活是我们生活中不断交织的两个重要方面。对许多人来说,找到两者之间的完美平衡已经成为一个持久的挑战。然而,与其专注于平衡,更重要的是要认识到工作和生活并不是可以相互平衡的两个分离实体,而是一个相互影响的循环。正…

[word] word小数点对齐怎么设置 #微信#其他#其他

word小数点对齐怎么设置 使用Word编辑文档的时候,如果有小技巧的话,可以解决很多遇到的问题,也让工作更高效的完成,下面给大家分享word小数点对齐怎么设置的小技巧。 1、设置格式 选中内容,点击段落一一制表符&#…

扩展鸿蒙textinput组件

扩展鸿蒙textinput组件,支持快速扩展展性,标题文本等,文本内容双向绑定、文本组件快速复用。 组件代码 /*** 单选文本*/ Component export default struct DiygwInput{//绑定的值Link value:string;//未选中图标State labelImg: Resource …

探索虚拟与增强现实的无限可能:塑造未来的生活体验

美国当地时间2月2日,苹果首款头显Vision Pro正式上市,当天,在员工高喊“AVP(Apple Vision Pro)”呼声中,苹果首席执行官蒂姆‧库克(Tim Cook)在位于纽约曼哈顿第五大道的苹果旗舰店开…

ShardingSphere 5.x 系列【3】分库分表中间件技术选型

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 前言2. My Cat3. ShardingSphe…

Docker 一小时从入门到实战 —— Docker commands | Create your own image | vs VM ... 基本概念扫盲

Docker crash course 文章目录 Docker crash course1. What and Why of Docker?2.1 What2.2 What problem does it solve?2.2.1 before containers2.1.2 with containers 2. Docker vs Virtual Machines2.1 Difference2.2 Benefits 3. Install docker locally4. Images vs Co…

【CSS】外边距折叠(margin 塌陷)

外边距折叠(collapsing margins) 毗邻的两个或多个margin会合并成一个margin,叫做外边距折叠。 规则如下: 两个或多个毗邻的普通流中的块元素垂直方向上的 margin会折叠浮动元素 / inline-block元素 / 绝对定位元素 / 行内元素的margin不会和垂直方向上的其他元素…

【网站项目】046人事管理信息系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

锁优化的方法

减少锁持有时间 减少锁粒度 将大对象拆分成小对象,增加并行度,降低锁竞争。ConcurrentHashMap允许多个线程同 时进入 锁分离 根据功能进行锁分离ReadWriteLock在读多写少时,可以提高性能。 锁消除 锁消除是发生在编译器级别的一种锁优化…

解放网工双手-SNMP如何做好运维辅助?

1. SNMP为什么被誉为“网管神器”? 2. SNMP不同版本有何区别? 3. SNMP有哪些问题及Telemetry有何优势? ---- SNMP ----- 简单网络管理协议 U2000:传输设备管理 企业,银行 esight:华为 iMaster NCE-Camp…

编码世界探秘:原反补码与实数表示,含定点、浮点及BCD编码

数值的编码表示 整数编码表示 在计算机中,因为只有0和1这两种形式,但为了表示数的正(),负(-)号,就要将数的符号以0和1编码。 通常把一个数的最高位定义为符号位,用0表…

#Z0458. 树的中心2

题目 代码 #include <bits/stdc.h> using namespace std; struct ff {int z,len; }; vector<ff> vec[300001]; int n,u,v,w,dp[300001][2],ans 1e9; void dfs(int x,int fa) {for(int i 0;i < vec[x].size();i){ff son vec[x][i];if(son.z ! fa){dfs(son.z,…

保护个人信息安全,避免成为“互联网中的裸泳者”

⚽️ 一、互联网中的裸泳者&#x1f3c0; 二、代理 IP 的应用 - 解锁无限可能⚾️ 三、代理 ip 的几种类型 3.1 动态住宅代理&#xff08;Rotating Residential Proxy&#xff09;3.2 静态住宅代理&#xff08;Static Residential Proxy&#xff09;3.3 动态长效ISP&#xff08…

LLM之RAG实战(二十四)| LlamaIndex高级检索(三):句子窗口检索

这是本系列关于高级检索技术的第三篇文章&#xff0c;之前的两篇分别介绍构建基本的RAG和父文档检索技术&#xff0c;本文我们将深入研究句子窗口检索技术。我将介绍如何设置它&#xff0c;并使用TruEval来测量其性能&#xff0c;并将其性能与我们在前几篇文章中介绍的其他技术…

华清作业day52

代码&#xff1a; #include <stdlib.h> #include <stdio.h> typedef struct Node {char data;struct Node *lchild;struct Node *rchild; }*Tree; //申请空间 Tree create_space() {Tree t (Tree)malloc(sizeof(struct Node));if(NULL t){return NULL;}t->da…

深度神经网络中的BNN和DNN:基于存内计算的原理、实现与能量效率

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言引言内存计算体系结构深度神经网络&#xff08;DNN&#xff09;随机梯度的优…