汇编语言实验2

一、实验目的
1. 理解并掌握汇编源程序组成与结构
2. 掌握汇编语言源程序编写→汇编→链接→调试的工具和方法
3. 理解汇编源程序中地址表示、段寄存器的用法
4. 理解和掌握寄存器间接寻址方式[bx]
5. 通过汇编指令loop的使用理解编程语言中循环的本质

 

二、实验准备
1. 学习/复习第5章使用[bx]和loop实现循环的编程应用示例(教材5.5节,5.8节)
2. 复习第3章「栈」的知识
3. 结合第4章课件,复习完整汇编源程序编写→汇编→连接→运行→调试的方法
4. 复习8086汇编中内存单元地址的表示,以及段寄存器DS, SS, ES, CS的用途

 

三、实验内容

1. 实验任务1 使用任意一款文本编辑器,编写8086汇编源程序ex1.asm。源代码如下:

 1 ;ex1.asm
 2 assume cs:code
 3 code segment
 4 mov ax, 0b810h
 5 mov ds, ax
 6 mov byte ptr ds:[0], 1
 7 mov byte ptr ds:[1], 1
 8 mov byte ptr ds:[2], 2
 9 mov byte ptr ds:[3], 2
10 mov byte ptr ds:[4], 3
11 mov byte ptr ds:[5], 3
12 mov byte ptr ds:[6], 4
13 mov byte ptr ds:[7], 4
14 mov ah, 4ch
15 int 21h
16 code ends
17 end

要求:使用8086汇编程序编写、汇编、链接、运行、调试方法,对ex1.asm进行汇编、链接、运行,使用debug工具调试可执行文件。

  • 使用masm、link对ex1.asm进行汇编、链接,得到可执行文件ex1.exe,运行并观察结果

 

 

 

 

  • 使用debug工具对程序进行调试

使用debug加载可执行文件ex1.exe后,使用d命令查看程序段前缀PSP所占的256个字节。

 

结合可执行文件中寄存器CX的值,使用u命令对ex1.exe进行精确反汇编
使用g命令执行到程序退出执行之前(即源码文件中line16之前),观察结果

 

 

 

2. 实验任务2
使用任意一款文本编辑器,编写8086汇编源程序ex2.asm。源代码如下:

; ex2.asm
assume cs:code
code segment
mov ax, 0b810h
mov ds, ax
mov bx, 0
mov ax, 101H
mov cx, 4
s: mov [bx], ax
add bx, 2
add ax, 101H
loop smov ah, 4chint 21hcode endsend

要求:使用8086汇编程序编写、汇编、链接、运行、调试方法,对ex2.asm进行汇编、链接、运行,用debug工具调试可执行文件。

  • 使用masm、link对ex2.asm进行汇编、链接,得到可执行文件ex2.exe,运行并观察结果

 

 

 

  • 使用debug工具对程序进行调试。

结合可执行文件中寄存器CX的值,使用u命令对ex2.exe进行精确反汇编。

灵活使用t命令、p命令、g命令,对ex2.exe进行调试。(不一定要单步,有些地方可以用g命令,一次执行多行汇编指令)。

R命令

 

 

t命令

 

 

 

 

p命令

 

 

 

 

 g命令

 

 

把ex2.asm中line9 mov cx, 4 改成 mov cx, 8 ,保存后重新汇编、链接、运行并观察结果。

 

 

结合上述实验和观察,分析、对比ex2.asm和ex1.asm,它们实现的是否是相同的功能和效果?在具体实现上有什么不同?

它们的功能效果都是向显存中写入数据,但是他们的循环次数cx不同所以具体是实现上,第一个实验显示4个图像,第二个实验显示8个图像。

 

 

 3. 实验任务3
综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0237H。

assume cs:code
code segment
mov ax,0b800h
mov ds,ax
mov bx,07b8h
mov cx,000fh
s:mov [bx],0237h
inc bx
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end

 

 

 把填充的字数据,从0237H 改成0239H,再次保存后,汇编、链接、运行,观察结果。

 

 

把填充的字数据,从0237H 改成0437H,再次保存后,汇编、链接、运行,观察结果。

 

 

 

猜测并分析,这个字数据中高位字节里存放的是什么信息,低位字节里存放的是什么信息。

根据上图猜测:高位字节里存放颜色信息,低位字节存放数字信息。

 

4. 实验任务4

  • 编写完整汇编源程序,实现向内存0:200~0:23F依次传送数据0~63(3FH)。
assume cs:code
code segment
    mov ax,0h
    mov ds,ax
    mov bx,0200h
    mov dx,0h    ;0~63(3fh)
    mov cx,40h
s:    mov ds:[bx],dl
    inc dx
    inc bx
    loop s    
    mov ax,4c00h
    int 21h
code ends
end

 

 灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看0:200~0:23F,确认是否将0~3F传送至此段内存区域。

t,p,d命令

 

 

g命令

 

 

 

 

5. 实验任务5
教材实验4(3)(P121)

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

 

 

 

cx=10时,验证

 

 

查得具体位置为17,将数据改成17,重新实验。

 

 

 复制后代码。

 

 

因为将ax送给ds寄存器,表示传送段地址位置,所以第一个空填入cs寄存器的值。

然后我们随便在第二空填一个数,先填个10。然后用u命令来查看mov ax,4c00h的具体位置,查得具体位置为17,将数据改成17所以第二空填17。

 

posted on 2020-11-05 19:19  飞羽0-0  阅读(257)  评论(2)    收藏  举报