检测点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 4e | mov ax,4E20H |
| 05 16 14 | add ax,1416H |
| bb 00 20 | mov bx,2000H |
| 01 d8 | add ax,bx |
| 89 c3 | mov bx,ax |
| 01 d8 | add ax,bx |
| b8 1a 00 | mov ax,001AH |
| bb 26 00 | mov bx,0026H |
| 00 d8 | add al,bl |
| 00 dc | add ah,bl |
| 00 c7 | add bh,al |
| b4 00 | mov ah,0 |
| 00 d8 | add al,bl |
| 04 9c | add 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 区域是显存地址空间
向该区域写入数据,就是向显存中写入数据,被修改的内存单元对应的像素也会发生改变
本文详细解析了汇编语言中的基本指令及其对寄存器的影响,并通过具体实例展示了如何使用Debug工具来逐步执行汇编指令,观察寄存器的变化。此外,还介绍了如何在内存中查找和尝试修改特定数据。
2177

被折叠的 条评论
为什么被折叠?



