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

该博客围绕汇编语言的多个检测点展开,涉及CPU寻址能力、数据总线与地址总线、汇编指令执行结果、内存操作、中断例程等内容,详细分析了各检测点的问题并给出解答,帮助理解汇编语言的相关概念和操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

检测点 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, 62627 AX= F4A3H 62627 转16进制=F4A3H
mov ah, 31H AX=31A3H 修改AX的高8位为 31H
mov al, 23H AX=3123H 修改AX的低8位为 23H
add ax, ax AX=6246H 3123 + 3123 = 6246H
mov bx, 826CH AX=6246H, BX=826CH
mov cx, ax AX=6246H, BX=826CH, CX=6246H
mov ax, bx AX=826CH, BX=826CH, CX=6246H
add ax, bx AX=04D8H, BX=826CH, CX=6246H
mov al, bh AX=0482H, BX=826CH, CX=6246H 修改 ax 的低8位 = bx 的高8位
mov ah, bl AX=6C82H, BX=826CH, CX=6246H 修改 ax 的高8位 = bx 的低8位
add ah, ah AX=D882H, BX=826CH, CX=6246H ax 高8位相加: 6C + 6C = D8H
add al, 6 AX=D888H, BX=826CH, CX=6246H ax 低8位 + 6:82 + 6 = 88H
add al, al AX=D810H, BX=826CH, CX=6246H ax 低8位相加:88 + 88 = 110H
0001 0001 0000高4位溢出丢失。ax = 10H
mov ax, cx AX=6246H, BX=826CH, CX=6246H
  1. 只能使用目前学过的汇编指令,最多使用 4条指令,编程计算 2的4次方。
指令 ax值
mov ax, 2 2
add ax, ax 2+2=4
add ax, ax 4+4=8
add ax, ax 8+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 最大
1 min * 16 + FFFFH = 20000H max * 16 + 0000H = 20000H
2 min * 16 = 20000H - FFFFH (偏移地址最大时,段地址最小) max * 16 + 0000H = 20000H
3 min = 10001H ÷ 16 max = 20000H ÷ 16
4 min = 0001 0000 0000 0000 0001B >> 4 max = 0010 0000 0000 0000 0000B >> 4
5 min = 0001 0000 0000 0000. 0001B max = 0000 0010 0000 0000 0000B
6 min = 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
分析完毕,开始计算
8 min * 16 = 20000H - FFF0H
9 min = 10010H ÷ 16
10 min = 1001H (得到最小值)

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

="20000H - "&DEC2HEX(65536-ROW())&"H"	=	=DEC2HEX(E1)&"H"	|	=131072-65536+ROW()	|	=E1&" ÷ 16 = "&E1/16
减小偏移地址 十进制 检查整除
20000H - FFFFH = 10001H 65537 65537 ÷ 16 = 4096.0625
20000H - FFFEH = 10002H 65538 65538 ÷ 16 = 4096.125
20000H - FFFDH = 10003H 65539 65539 ÷ 16 = 4096.1875
20000H - FFFCH = 10004H 65540 65540 ÷ 16 = 4096.25
20000H - FFFBH = 10005H 65541 65541 ÷ 16 = 4096.3125
20000H - FFFAH = 10006H 65542 65542 ÷ 16 = 4096.375
20000H - FFF9H = 10007H 65543 65543 ÷ 16 = 4096.4375
20000H - FFF8H = 10008H 65544 65544 ÷ 16 = 4096.5
20000H - FFF7H = 10009H 65545 65545 ÷ 16 = 4096.5625
20000H - FFF6H = 1000AH 65546 65546 ÷ 16 = 4096.625
20000H - FFF5H = 1000BH 65547 65547 ÷ 16 = 4096.6875
20000H - FFF4H = 1000CH 65548 65548 ÷ 16 = 4096.75
20000H - FFF3H = 1000DH 65549 65549 ÷ 16 = 4096.8125
20000H - FFF2H = 1000EH 65550 65550 ÷ 16 = 4096.875
20000H - FFF1H = 1000FH 65551 65551 ÷ 16 = 4096.9375
20000H - FFF0H = 10010H 65552 65552 ÷ 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, bx AX=E626
mov ax, [0000] AX=2662
mov bx, [0002] BX=D6E6
add ax, bx AX=FD48
add ax, [0004] AX=2C14
mov ax, 0 AX=0000
mov al, [0002] AX=00E6
mov bx, 0 BX=0000
mov bl, [000C] BX=0026
add al, bl AX=000C
    1. 内存中的情况如图 3.6 所示。
      各寄存器的初始值: CS=2000H,IP=0,DS=1000H,AX=0,BX=0;
  1. 写出 CPU 执行的指令序列(用汇编指令写出)。
  2. 写出 CPU 执行每条指令后,CS、IP 和相关寄存器中的数值。
  3. 再次体会: 数据和程序有区别吗?如何确定内存中的信息哪些是数据,哪些是程序?

在这里插入图片描述

解:

指令 CS IP DS AX BX
开始 2000 0000 1000 0000 0000
mov ax, 6622H 0003 6622
jmp 0ff0:0100 1000 0000
mov ax, 2000H 0003 2000
mov ds, ax 0005 2000
mov ax, [0008] 0008 C389
mov ax, [0002] 000B EA66
结束 1000 000B 2000 EA66 0000

数据程序在内存中都是机器码没有区别。
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,
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笑虾

多情黯叹痴情癫。情癫苦笑多情难

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值