王爽汇编语言答案(1-4)

王爽汇编语言答案(1-4章)

检测点

chapter1

检测点1.1

(1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为13
(2)1KB的存储器有个存储单元。存储单元的编号从00001023
(3)1KB的存储器可以存储个8192bit,1024个Byte。
(4)1GB、1MB、1KB分别是2^30 , 2^20 , 2^10Byte。
(5)8080、8088、80286、80386的地址总线宽度分别为16根、20根、24根、32根,则它们的寻址能力分别为:64(KB)、1(MB)、16(MB)、4(GB)。
(6)8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32根则它们一次可以传送的数据为:1(B)、1(B)、2(B)、2(B)、4(B)
(7)从内存中读取1024字节的数据,8086至少要读512次,80386至少要读256次。
(8)在存储器中,数据和程序以形式二进制存放。

chapter2

检测点2.1

1.写出每条汇编指令执行后相关寄存器中的值。

指令 寄存器
mov ax, 62627 AX = F4A3H
mov ah, 31H AX = 31A3H
mov al, 23H AX = 3123H
add ax, ax AX = 6246H
mov bx, 826CH BX = 826CH
mov cx, ax CX = 6246H
mov ax, bx AX = 826CH
add ax, bx AX = 04D8H
mov al, bh AX = 0482H
mov ah, bl AX = 6C82H
add ah, ah AX = D882H
add al, 6 AX = D888H
add al, al AX = D810H
mov ax, cx AX = 6246H
  1. 只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。
mov ax, 2  ;ax = 2
add ax, ax ;ax = 4
add ax, ax ;ax = 8
add ax, ax ;ax = 16

检测点2.2

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

检测点2.3

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

mov ax, bx
sub ax, ax
jmp ax

**共计4次修改IP的值:

  1. mov ax, bx 指令加载至指令缓冲器后
  2. sub ax, ax 指令加载至指令缓冲器后
  3. jmp ax 指令加载至指令缓冲器后
  4. jmp ax 执行后,IP变为0000H**

chapter3

检测点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=2662H |
| mov bx, [0001] | BX=E626H |
| mov ax, bx | AX=E626H |
| mov ax, [0000] | AX=2662H |
| mov bx, [0002] | BX=D6E6H |
| add ax, bx | AX=FD48H |
| add ax, [0004] | AX=2C14H |
| mov ax, 0 | AX=0000H |
| mov al, [0002] | AX=00E6H |
| mov bx, 0 | BX=0000H |
| mov bl, [000C] | BX=0026H |
| add al, bl | AX=000CH |

  1. 内存中的情况如图所示

各寄存器的初始值:CS=2000H,IP=0,DS=1000H,AX=0,BX=0;

  1. 写出CPU执行的指令序列(用汇编指令写出)。
  2. 写出CPU执行每条指令后,CS、IP和相关寄存器中的数值。
  3. 再次体会:数据和程序有区别吗?如何确定内存中的信息哪些是数据,哪些是程序?
mov ax,6622H  ;CS= 2000H IP= 0003H AX= 6622H
jmp 0ff0:0100 ;CS= 0fff0 IP= 0100H 
mov ax,2000H  ;CS= 0fff0 IP= 0103H AX= 2000H
mov ds,ax     ;CS= 0fff0 IP= 0105H DS= 2000H
mov ax,[0008] ;CS= 0fff0 IP= 0108H AX= C389H
mov ax,[0002] ;CS= 0fff0 IP= 010BH AX= 6622H

程序和数据没有区别,都是在内存单元中的二进制码。当内存单元被CS:IP指定时其存储的就被当做程序执行。当内存单元被DS:偏移地址指定时其存储的就是数据。

检测点3.2

1.补全下面的程序,使其可以将10000H1000FH中的8个字,逆序复制到20000H2000FH中。

mov ax, 1000H
mov ds, ax
mov ax, 2000H
mov ss, ax
mov sp, 0010H
push [0]
push [2]
push [4]
push [6]
push [8]
push [A]
push [C]
push [E]

2.补全下面的程序,使其可以将10000H1000FH中的8个字,逆序复制到20000H2000FH中。

mov ax, 2000H
mov ds, ax
mov ax, 2000H
mov ss, ax
mov sp, 0010H
pop [E]
pop [C]
pop [A]
pop [8]
pop [6]
pop [4]
pop [2]
pop [0]

实验

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

Debug的使用

什么是Debug:
Debug是DOS、Windows都提供的实模式(8086方式)程序的调试工具。使用它,可以查看CPU各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行。

Debug的命令:

  1. 用Debug的R命令查看、改变CPU寄存器的内容;
  2. 用Debug的D命令查看内存中的内容;
  3. 用Debug的E命令改写内存中的内容;
  4. 用Debug的U命令将内存中的机器指令翻译成汇编指令;
  5. 用Debug的T命令执行一条机器指令;
  6. 用Debug的A命令以汇编指令的格式在内存中写入一条机器指令。
    Debug的命令比较多,共有20多个,但这6个命令是和汇编学习密切相关的。

如何进入Debug:
现在通过其他的虚拟机方式,还原到窗口并不现实,相当麻烦,这里采用Dosbox模拟运行。

具体搭建可见,不是我写的

关于dubug更详细的操作可以看原书,或者下载非整书,截取了debug部分的内容,提取码za88

注意在debug中,所有的数字均为16进制表示,mov ax,1839后,ax就为1893

第一个小实验

第三个小实验
会发现内容无法更改图中红圈所示。

第四个小实验
e命令选的内存为显存内存,DOS界面被更改。

实验2 用机器指令和汇编指令编程

  1. 修改SS寄存器
    在debug中单步执行以下程序:
mov ax,1000H
mov ss,ax
mov bx,8945H
mov sp,2834H

我们发现,在执行了mov ss, ax后,直接转向执行mov sp, 2834H,观察bx的值,我们发现mov bx, 8945H 已经被执行过了。不单是mov ss,ax,对如mov ss,bx,mov ss,[0],pop ss等指令都会发生上面的情况,这些指令有哪些共性呢?它们都是修改栈段寄存器ss的指令。产生该现象是由于中断机制的原因,这部分内容将会在后面详细说明。

  1. 使用Debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。
mov ax, ffff
mov ds, ax
mov ax, 2200
mov ss, ax
mov sp, 0100

mov ax, [0]        ;ax= c0ea
add ax, [2]        ;ax= c0fc
mov bx, [4]        ;bx= 30f0
add bx, [6]        ;bx= 6021

push ax            ;sp=00fe 
push bx            ;sp=00fc 
pop ax             ;sp=00fe ;ax=6021
pop bx             ;sp=0100 ;bx=c0fc
push [4]           ;sp=00fe
push [6]           ;sp=00fc
  1. 仔细观察图中程序,思考为什么2000:0~f内存会发生变化。

通过观察我们可以很明显的发现从内存高位到低位,第2个字的位置储存了CS寄存器中的值,第3个字的位置储存了IP寄存器中的值,而第5个字的位置很有可能储存了AX寄存器中的值,或者SS寄存器,为了验证我们的猜想,我们换一块位置写我们的程序,并且在之前给BX和CX都赋值。

通过观察可以发现,确实是和bx和cx无关,关于CS和IP寄存器猜想是正确的,5个字中保存了SS寄存器的值。造成这个原因的,应该是修改SS寄存器中断机制的原因。

实验3 编程、编译、连接、跟踪

  1. 将下面的程序保存为 t1.asm文件,将 其生成可执行文件 t1.exe
  2. 用debug跟踪t1.exe的执行过程
  3. PSP的头两个字是CD 20,用debug查看PSP的内容
assume cs : codesg
	codesg segment
		mov ax, 2000H 
		mov ss, ax
		mov sp, 0 
		add sp, 10
		pop ax
		pop bx 
		push ax 
		push bx 
		pop ax 
		pop bx

		mov ax, 4c00H
		int 21H
	codesg  ends
end

执行过程

mov ax, 2000H ; ax=2000
mov ss, ax    ; ss=2000
mov sp, 0     ; sp=0000
add sp, 10    ; sp=000A
pop ax        ; sp=000C ax=0000
pop bx        ; sp=000E bx=0000
push ax       ; sp=000C
push bx       ; sp=000A
pop ax        ; sp=000C
pop bx        ; sp=000E
mov ax, 4c00H ; ax=4C00
int 21H       ;
修改SS,中断并未影响栈
查看PSP d DS:0000
posted @ 2021-04-13 17:27  W&B  阅读(1102)  评论(0编辑  收藏  举报