0
点赞
收藏
分享

微信扫一扫

汇编语言(王爽)-实验

booksmg2014 2022-02-23 阅读 87
开发语言

第一章 基础知识

1.汇编语言有以下三类指令组成:

(1)汇编指令:机器码的助记符,有对应的机器码。

(2)伪指令:没有对应的机器码,由编译器执行,计算机并不执行。

(3)其他符号:如:+、-、*、/等,由编译器识别,没有对应的机器码。

第二章 寄存器

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

执行之前:

执行第一条指令之后,ax=4e20

 执行第二条指令之后,ax=6236

执行第三条指令之后,bx=2000

执行第四条指令之后,ax=8236

执行第五条指令之后,bx=8236

执行第六条指令之后,ax=046c(8236h+8236h=1046ch,溢出,只保存046c)

执行第七条指令之后,ax=001a

执行第八条指令之后,bx=0026

执行第九条指令之后,ax=0040

执行第十条指令之后,ax=2640

执行第十一条指令之后,bx=4026

 执行第十二条指令之后,ax=0040

执行第十三条指令之后,ax=0066

执行第十四条指令之后,ax=0002 

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

输入指令执行即可。

3.查看内存中的内容。

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

第三章 寄存器(内存访问)

1.使用Debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实验运行情况填空。

mov ax, ffff
mov ds, ax
mov ax, 2200
mov ss, ax
mov sp, 1000
mov ax,[0]  ;ax = 5bea
add ax,[2]  ;ax = 5cca
mov bx,[4]  ;bx = 31f0
add bx,[6]  ;bx = 6121
push ax     ;sp = 00fe 修改的内存单元的地址是220fe内容为5cca
push bx     ;sp = 00fc 修改的内存单元的地址是220fc内容为6121
pop ax      ;sp = 00fe ax = 6121
pop bx      ;sp = 0100 bx = 5cca
push [4]    ;sp = 00fe 修改的内存单元的地址是220fe内容为31f0
push [6]    ;sp = 00fc 修改的内存单元的地址是220fc内容为2f31
 

 

2.仔细观察图3.19中的实验过程,然后分析:为什么2000:0~2000:f中的内容会发生改变?

在使用t命令时,执行到mov ss,ax时,由于ss保存段地址,sp保存偏移地址,需要连续执行这两条指令,会发生中断,为了保护现状,CPU将CS和IP,此时的位置,入栈,由于目前开辟的栈空间在2000:0~2000:f之间,这就导致了内存相关位置内容的改变。

第四章 第一个程序

1.将下面的程序保存为t1.asm文件,将其生成可执行文件t1.exe。

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

使用radsam。新建工程,生成可执行exe文件。

2.用Debug跟踪t1.exe的执行过程,写出每一步执行后,相关寄存器中的内容和栈顶的内容。

使用debug加载exe文件后:

 单步执行后:

ax 2000H
ss 2000H
sp 0000H
sp 000AH
ax 0 sp 000cH
bx 0 sp 000EH
sp 000cH
sp 000AH
ax 0 sp 000cH
bx 0 sp 000EH
ax 4c00H
empty

 

3.PSP头两个字节为CD 20,用debug加载t1.exe,查看PSP内容

使用D命令,查看ds:0就可以了。因为DS寄存器的初始化值为PSP的段地址。

 第五章 [BX]和loop指令

1.编程,向内存0:200~0:23F依此传送数据0~63(3FH)。

assume cs:code    
code segment
start: 
   mov ax,0000h
   mov ds,ax
   mov bx,0200h
   
   mov dx,0000h
   mov cx,64
 s:mov ds:[bx],dl
   inc dx
   inc bx
   loop s
     
   mov ax,4c00h
   int 21h
  code ends
  end start

2.编程,向内存0:200~0:23F依此传送数据0~63(3FH),程序中只能使用9条指令,9条指令中包括“mov ax, 4c00h”和“int 21h”。

;向内存0:200~0:23F依此传送数据0~63(3FH)。
assume cs:code    
code segment
start: 
   mov ax,0200h
   mov ds,ax
 
   
   mov bx,0000h
   mov cx,64
 s:mov ds:[bx],bl
   inc bl
  
   loop s
     
   mov ax,4c00h
   int 21h
  code ends
  end start
  

 3.下面的程序的功能是将“mov ax, 4c00h”之前的指令复制到内存的0:200处,补全程序,上机调试,跟踪运行结果

assume cs:code
code segment
mov ax, __cs__
mov ds, ax
mov ax, 0020h
mov es, ax
mov bx, 0
mov cx, ___23__
s:  mov al, [bx]
    mov es:[bx], al
    inc bx
    loop s
mov ax, 4c00h
int 21h
code ends
end

第六章 包含多个段的程序

1.将下面的程序编译连接,用Debug加载、跟踪,然后回答问题。

debug加载exe后,使用u查看 

①data段中的数据为0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

②cs=0b87 ss=0b86 ds=0b85 

③code:x data:x-2 stack:x-1

2.将下面的程序编译连接,用Debug加载、跟踪,然后回答问题。

①data段中的数据不变

②cs=0b87 ss=0b86 ds=0b85 

③code:x data:x-2 stack:x-1

④([N]+1) * 16 (字节对齐)

3.将下面的程序编译连接,用Debug加载、跟踪,然后回答问题。

①data段中的数据不变

②cs=0b87 ss=0b86 ds=0b85 

③code:x data:x+3 stack:x+4

4.如果将1. 2. 3.题中的最后一条伪指令“end start”改为“end”(也就是说,不指明程序的入口),则哪个程序仍然可以正确执行?请说明原因。

程序3,在不指明程序入口的情况下,程序默认按照顺序从头开始执行.

5.程序如下,编写code段中的代码,将a段和b段中的数据依此相加,将结果存到c段中

assume cs:code
a segment
 db 1,2,3,4,5,6,7,8
a ends

b segment
 db 1,2,3,4,5,6,7,8
b ends

d segment
 db 0,0,0,0,0,0,0,0
d ends

code segment
start:mov ax,a
      mov ds,ax
      mov ax,b
      mov es,ax

mov ax,d

mov ss,ax

mov bx,0h

mov cx,8

s:

mov al,[bx]
add al,es:[bx]
mov ss:[bx],al
inc bx
loop s

mov ax,4c00h
int 21h
code ends
end start

6.程序如下,编写code段中的代码,用push指令将a段中的前8个字型数据,逆序存储到b段中。

start:
mov ax, b
mov ss, ax
mov sp, 16
mov ax, a
mov ds, ax
mov bx, 0
mov cx, 8
s:
push [bx]
add bx,2
loop s

mov ax, 4c00H
int 21h

举报

相关推荐

0 条评论