汇编语言(第四版)第二章实验以及检测点解答

本文详细解析了汇编语言中的基本指令及其对寄存器的影响,并通过具体实例展示了如何使用Debug工具来逐步执行汇编指令,观察寄存器的变化。此外,还介绍了如何在内存中查找和尝试修改特定数据。

检测点2.1

(1)写出每条汇编指令执行后相关寄存器的值

        mov ax,62627             AX=  F4A3H      62627对应十六进制为F4A3,将对应的十六进制数放入AX(注意这条指令只能通过汇器汇编后编执行,不能直接在dbeug中写入执行)

        mov ah,31H                AX= 31A3H        将十六进制数31H送入AX的高8位

        mov al,23H                 AX= 3123H         将十六进制数23H送入AX的低8位

        add ax,ax                   AX= 6246H         AX= AX+AX = 3123H+3123H = 6246H

        mov bx,826CH           BX= 826CH         将十六进制数826CH送入AX寄存器中

        mov cx,ax                  CX= 6246H          将AX寄存器中的内容送入CX寄存器中

        mov ax,bx                  AX= 826CH          将BX寄存器中的内容送入AX寄存器中

        add ax,bx                  AX= 04D8H         AX = AX + BX = 826CH + 826CH = 104D8H(溢出一位,舍去后变为04D8H)

        mov al,bh                  AX= 0482H          将BX寄存器的高8位 82H 送入 AX 寄存器的低8位

        mov ah,bl                  AX= 6C82H         将BX寄存器的低8位 6CH 送入 AX寄存器的高8位

        add ah,ah                 AX= D882H         AH = AH + AH = 6CH + 6CH = D8H

        add al,6                    AX= D888H         AL = AL + 6 = 82H + 6H = 88H (注意6是十进制数)

        add al,al                   AX= D810H         AL = AL + AL = 88H + 88H = 110H 溢出,舍去一位后变为10H。(注意,溢出的位不会进位到高8位上)

        mov ax,cx                AX= 6246H          将寄存器CX中的值送入到AX中

(2)只使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方

mov ax,2     ;2的1次方
add ax,ax    ;2的2次方
add ax,ax    ;2的3次方
add ax,ax    ;2的4次方

检测点2.2

(1)给定段地址为 0001H,仅通过变化偏移地址寻址,CPU的寻址范围为  00010H 到 1000FH  。解析:内存地址 = 段地址(二进制) << 4 + 偏移地址

                偏移地址变化范围 0000H ~ FFFFH

                故内存地址最小为 00010H + 0000H = 00010H

                    内存地址最大为 00010H + FFFFH = 1000FH

(2)有一数据存放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻到此单元。则SA应满足的条件是:最小为 1001H ,最大为 2000H

  解析:段地址 = (内存地址 - 偏移地址) >> 4   (可能会丢失精度)

             偏移地址变化范围 0000H ~ FFFFH

             故段地址最小为 (20000H - FFFFH) >> 4 = 1000H

                但是,当段地址为 1000H时 内存地址 = 1000H << 4 + FFFFH = 1FFFFH

                是无法寻址到 20000H 内存单元的,很显然是在右移过程地址精度丢失了

                所以段地址要 +1 以弥补右移过程中丢失的精度才能寻址到 20000H

                即段地址最小为 1001H

                段地址最大为 (20000H - 0000H) >> 4 = 2000H 

检测点2.3

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

        mov ax,bx

        sub ax,ax

        jmp ax

(1)CPU修改4次IP

(2)在读取 mov ax,bx 指令后,IP修改一次

         在读取 sub ax,ax 指令后,IP修改一次

         在读取 jmp ax 指令后,IP修改一次

         由于 jmp ax 指令用于修改寄存器IP的值,故IP会在指令执行时再修改一次

(3)第二条指令 sub ax,ax 用于将寄存器置零,ax的值会变为 0000

         故在第三条指令执行时,IP的值会被修改为 0000

注:“jmp 某一合法寄存器“ 指令的功能为:用寄存器中的值修改IP

实验1 查看CPU和内存,用机器指令和汇编指令编程

1、预备知识:Debug的使用

2、实验任务

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

机器码汇编指令
b8 20 4emov ax,4E20H
05 16 14add ax,1416H
bb 00 20mov bx,2000H
01 d8add ax,bx
89 c3mov bx,ax
01 d8add ax,bx
b8 1a 00mov ax,001AH
bb 26 00mov bx,0026H
00 d8add al,bl
00 dcadd ah,bl
00 c7add bh,al
b4 00mov ah,0
00 d8add al,bl
04 9cadd al,9CH

实验结果:

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

(3)查看内存中的内容。

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

        提示,如果读者对实验的结果感到疑惑,请仔细阅读第一章中的1.15节

由图可知生产日期在内存 FFFF5~FFFFC 处

现在修改一下 FFFF5 的值 将 30 修改为 56

30的值没有改变为56,因为 C0000H~FFFFFH 的内存单元是各类ROM的地址空间,在这一区域写入数据的操作是无效的,因为这等于改写只读存储器中的内容。

(4)向内存从 B8100H 开始的单元中填写数据,如:

-e B810:0000 01 01 02 02 03 03 04 04

请读者先填写不同的数据,观察产生的现象;再改变填写的地址,观察产生的现象。提示,如果读者对实验的结果感到疑惑,请仔细阅读第1章中的 1.15 节

由上图可知,在命令控制行中出现了一个彩色图案

因为 A0000H~BFFFFH 区域是显存地址空间

向该区域写入数据,就是向显存中写入数据,被修改的内存单元对应的像素也会发生改变 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值