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

news2024/10/7 20:29:25

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

  • 检测点 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 segment
		dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h	; cs:0~15

start:	mov ax, 0
		mov ds, ax		
		mov bx, 0
		
		mov cx, 8
	s:	mov ax:[bx]	
		mov cs:[bx], ax		; 将数据逐个送到 cs:[0]到 cs:[15]
		add bx, 2
		loop s		
		
		mov ax, 4c00h		
		int 21h
code ends
end start
  1. 下面的程序实现依次用内存 0:0~0:15 单元中的内容改写程序中的数据,数据的传送用栈来进行。栈空间设置在程序内。完成程序:
assume cs:code
code segment
		dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h	; cs:00~0F
		dw 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 + 2
		
		mov ax, 0
		mov ds, ax
		mov bx, 0
		mov cx, 8
	s:	push [bx]	
		pop cs:[bx]		; 数据出栈就送到 cs:[0]到 cs:[15]
		add bx, 2
		loop s		
		
		mov ax, 4c00h		
		int 21h
code ends
end start

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

检测点 9.1

  1. 程序如下
assume cs:code

data segment
	?
data ends

code segment
 start:	mov ax,data
		mov ds,ax
		mov bx,0
		jmp word ptr [bx+1]
code ends
end start

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

assume cs:code

data segment
	db 00				; data 段的第1个字节,值随意
	dw offset start		; data 段的第2、3两个字节保存标号 start 的偏移地址
data ends

code segment
 start:	mov ax,data
		mov ds,ax
		mov bx,0
		jmp word ptr [bx+1]	; bx 的值是 0 ,所以最终从 ds:[1] 处读偏移地址。长度 1 word 
code ends
end start

jmp word ptr [bx+1] 从数据段的第2、3两个字节读取偏移地址
所以只要取得标号 start 的偏移地址存在此处即可。

  1. 程序如下
assume cs:code

data segment
	dd 12345678H
data ends

code segment
 start:	mov ax,data
		mov ds,ax
		mov bx,0
		mov [bx],_____
		mov [bx+2],_____
		jmp dword ptr ds:[0]
code ends
end start

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

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

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

解:

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

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

相关文章

###C语言程序设计-----C语言学习(9)#函数基础

前言:感谢您的关注哦,我会持续更新编程相关知识,愿您在这里有所收获。如果有任何问题,欢迎沟通交流!期待与您在学习编程的道路上共同进步。 一. 基础知识的学习 1.函数的定义 函数是一个完成特定工作的独立程序模块&…

酷开系统 | 拓展内容营销边界,酷开科技大屏价值全面升维

丰富的内容是智能大屏吸引消费者的关键。随着智能大屏各类垂直应用的增多,和长、短视频等多元内容的加入,使消费者的使用需求进一步激发和释放,这些流量的加入,也使大屏成为了营销的天然宝藏。酷开科技一直致力于OTT大屏营销&…

这个人脸考勤技术,拿走直接套用!请收藏!

随着科技的不断发展,人脸识别技术在各个领域得到了广泛应用,其中之一就是人脸考勤系统。 三维人脸考勤系统作为现代智能考勤的代表,通过先进的人脸识别技术,为组织提供了一种高效、准确、安全的考勤解决方案。 客户案例 制造企业…

【XR806开发板试用】TCP通信测试 Ping 命令测试

1.工程准备 由于要使用wifi功能,直接从wlan_demo复制一份出来,然后修改。 源文件只留下 main.c 就可以了。 BUILD.gn文件 import("//device/xradio/xr806/liteos_m/config.gni")static_library("app_mying") {configs []sources…

【C语言】const修饰指针的不同作用

目录 const修饰变量 const修饰指针变量 ①不用const修饰 ②const放在*的左边 ③const放在*的右边 ④*的左右两边都有const 结论 const修饰变量 变量是可以修改的,如果把变量的地址交给⼀个指针变量,通过指针变量的也可以修改这个变量。 但…

vue - 指令(一)

看文章可以得到什么? 1.可以快速的了解并会使用vue的指令 2.可以加深你对vue指令的理解,知道每个指令代表什么功能​​​​​​​ 目录 什么是vue的指令?​​​​​​​ vue常见指令的使用 v-html v-show v-if v-else 和v-else-…

JVM 性能调优 - Java 中的四种引用(4)

为什么会有四种引用 我们先回顾下在 Java 虚拟机内存体系(1) 中提到了的垃圾回收算法 1、引用计数法 原理:给对象添加一个引用计数器,每当有一个地方引用它,计数器的值就加一。每当有一个引用失效,计数器的值就减一。当计数器值为零时,这个对象被认为没有其他对象引用,…

解决ssh: connect to host 192.168.x.x port 22: Connection refused

我在使用scp命令向另一目标主机传输文件时提示ssh: connect to host 192.168.x.x port 22: Connection refused错误,总结出现的原因,及解决办法。 查看目标主机的ssh服务是否启动 service ssh status 如下图显示则启动状态 如果提示Unit ssh.service co…

python制作恶意软件删除工具

今天,来教大家用python制作一个恶意软件删除工具 查杀流程图 对,就这些,已经具备了杀毒软件的功能 判断文件是否为病毒 要查杀病毒,先要判断文件是不是病毒(不然删错了咋办),这里我们用获取文…

『运维备忘录』之 Vim 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等只是,甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作,持续给大家更新运维工作所需要接触到的知识点,希望大…

多彩贵州人文山水展风采,微环境监测智能调控护古韵

一、人文山水时光峰峦——多彩贵州历史文化展 2月3日,贵州省博物馆向公众开放《人文山水时光峰峦——多彩贵州历史文化展》。6000平方米展厅里,从石器时期开始,通过六个篇章,用3503件文物的回忆链,系统化的向观众揭开…

我要成为嵌入式高手之2月4、5日Linux高编第二天!!

读写函数接口 1、fgetc 语法&#xff1a; 功能&#xff1a;从流中获取一个字符 练习1&#xff1a;编写程序统计文件的行数 #include <stdio.h>int main(void) {FILE *fp NULL;char ch 0;int row 0;fp fopen("file.txt","r");if (NULL fp){pe…

C#验证字符串的长度,用正则表达式 vs 字符数组长度或字符串的长度

目录 一、使用的方法 1.使用正则表达式 2.通过计算字符串的长度验证 二、实例 1.源码 2.生成效果 一、使用的方法 1.使用正则表达式 使用正则表达式可以判断和限制用户输入的字符串长度。 比如验证用户密码不得少于8为&#xff0c;匹配的正则表达式"^.{8,}$"…

ShardingSphere 5.x 系列【5】Spring Boot 3 集成并实现读写分离

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 概述2. 使用限制3. 案例演示3.…

空气质量预测 | Matlab实现基于SVR支持向量机回归的空气质量预测模型

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 政府机构使用空气质量指数 (AQI) 向公众传达当前空气污染程度或预测空气污染程度。 随着 AQI 的上升,公共卫生风险也会增加。 不同国家有自己的空气质量指数,对应不同国家的空气质量标准。 基于支持向量机(Su…

高速接口PCB布局指南(一)高速信号接口概述

高速接口PCB布局指南&#xff08;一&#xff09;高速信号接口概述 1.什么是高速信号接口&#xff1f;2.高速信号PCB设计概述2.1 概述2.2 关键信号 tips&#xff1a;资料主要来自网络&#xff0c;仅供学习使用。 1.什么是高速信号接口&#xff1f; 高速信号接口是指用于传输高…

jmeter-04创建请求

文章目录 一、发送请求-查看响应流程二、新建请求三、选择请求方式&#xff0c;填写url1.发送get请求当只有请求方式不一样的时候&#xff0c;参数都填写在参数栏里面&#xff0c;GET请求与POST请求的区别&#xff1f; 2.发送post请求2.1 application/x-www-form-urlencoded2.2…

二叉搜索树题目:二叉搜索树的最近公共祖先

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;二叉搜索树的最近公共祖先 出处&#xff1a;235. 二叉搜索树的最近公共祖先 难度 3 级 题目描述 要求 给定一个…

Springboot集成ElasticSearch快速入门demo

一、ElasticSearch介绍 elasticsearch是构建在Apache Lucene上的使用Java语言开发的开源分布式搜素引擎。Lucene是一个开源的全文搜索引擎工具包&#xff0c;它仅是一个工具包而不是一个完整的工作引擎&#xff0c;并且只能被Java应用程序调用&#xff0c;elasticsearch基于RES…

云计算运营模式介绍

目录 一、云计算运营模式概述 1.1 概述 二、云计算服务角色 2.1 角色划分 2.1.1 云服务提供商 2.1.2 云服务消费者 2.1.3 云服务代理商 2.1.4 云计算审计员 2.1.5 云服务承运商 三、云计算责任模型 3.1 云计算服务模式与责任关系图 3.2 云计算服务模式与责任关系解析…