Java教程

实验2 多个逻辑段的汇编源程序编写与调试

本文主要是介绍实验2 多个逻辑段的汇编源程序编写与调试,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1.实验任务1

 任务1-1:

 对task1_1.asm进行汇编、连接:

 

 用debug加载:

 由于debug 执行到line 17结束,line19之前,先用u命令找到line 19对应命令的存储位置,再用g 命令直接进行到那条命令,如下:

 

 由图可知:
 ①此时DS=076Ah,SS=076Bh,CS=076Ch。

 ②假设code段地址是X,则data段地址是X-2,stack段地址是X-1。

 

 任务1-2:

 基本操作步骤与任务1-1一致,得最后debug结果:

 

 

 

    由图可知:

 ①此时DS=076Ah,SS=076Bh,CS=076Ch。

 ②假设code段地址是X,则data段地址是X-2,stack段地址是X-1。

 

 任务1-3

 基本操作步骤与任务1-1一致,得最后debug结果:

 

 

 

   由图可知:

 ①此时DS=076Ah,SS=076Ch,CS=076Eh。

 ②假设code段地址是X,则data段地址是X-4,stack段地址是X-2。

 

 任务1-4

 基本操作步骤与任务1-1一致,得最后debug结果:

 

 由图可知:
 ①此时DS=076Ch,SS=076Eh,CS=076Ah。

 ②假设code段地址是X,则data段地址是X+2,stack段地址是X+4。

 

 任务1-5:

 ①分配给该段的内存空间大小是(N/16)的上取整。

 ② 伪指令 end start 改成 end后得:

 task1_1截图:

 

 task1_2截图:

 

 task1_3截图:

 

 task1_4截图:

 

 由截图可知,只有task1_4.asm程序仍然可以正确执行。这是因为任务1_1到任务1_3都是先定义数据段再定义代码段,而任务1_4是先定义代码段再定义数据段的。end start告诉程序,代码是从start开始,写成end后程序就从第一行开始编译。因为任务1_4代码段写在前面,从第一行编译不受影响。

 

2.实验任务2

 实验代码:

assume cs:code

code segment
    mov ax, 0b800h
    mov ds, ax
    mov bx, 0f00h
    mov cx, 160
 s: mov ax, 0403h
    mov [bx], ax
    add bx, 2h
    loop s

    mov ax,4c00h
    int 21h
code ends
end
    

 实验结果截图:

 

 

3.实验任务3

 实验代码:

code segment
start:
    mov bx, 0
    mov cx, 10
 s: mov dx, 0    ;寄存器dx存数据
    mov ax, data1
    mov ds, ax 
    add dl, [bx]

    mov ax, data2
    mov ds, ax
    add dl, [bx]

    mov ax, data3
    mov ds, ax
    mov [bx], dl

    inc bx
    loop s

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

 实验效果截图:
 加载、反汇编、调试:

 

 调试后执行到结尾:

 

 逻辑段data1对应的内存空间:

 

 逻辑段data2对应的内存空间:

 

 逻辑段data3对应的内存空间:

 

 由各个对应的内存空间显示可知,结果的确保存在了逻辑段data3中。

 

4.试验任务4

 实验代码:

code segment
start:
    mov ax, data2
    mov ss, ax
    mov sp, 10h
    
    mov ax, data1
    mov ds, ax
    mov dx, 0
    mov cx, 8
  s:push [bx]
    add bx, 2
    loop s

    mov ah, 4ch
    int 21h
code ends
end start

 实验效果截图:

 经汇编、连接后debug加载程序得:

 

 data1内存单元存储如下:

 

 data2内存单元存储如下:

 

 又data1和data2存储内容得知,data2的确将data1的8个字数据逆序存储。

 

5.实验任务5

 实验效果截图:

 

 用debug运行到line 27结果截图如下:

 

 源代码中line 19的作用:将al与df h(即1101 1111)进行与操作,即将al从左数第三位变为0,从而实现将小写字母变成大写字母的操作。

 将line4的改为db 5 dup(2),结果截图如下:

 

 将line4的改为db 5 dup(5),结果截图如下:

 

 由此可见,line4的作用是改变字体的颜色。

 

6.实验任务6

 实验代码:

code segment
start:
   mov ax, data
   mov ds,ax
   mov bx, 0
   mov cx, 4
s0:push cx
   mov si, 0
   mov cx, 4
s1:or byte ptr [bx+si], 00100000b
   inc si
   loop s1
   add bx, 10h
   pop cx
   loop s0

   mov ah, 4ch
   int 21h
code ends
end start

 实验效果截图:

 

 debug过程,g执行,d查看:

 

 由截图得,每行第一个单词已经由大写变为小写。

 

7.实验任务7

 实验代码:

code segment
start:
    mov ax, data
    mov ds, ax
    mov ax, table
    mov es, ax
    
    mov bx, 0    ;存年份
    mov si, 0
    mov cx, 5
s0:mov ax, [si]    
    mov es:[bx], ax
    mov ax, [si+2]
    mov es:[bx+2], ax
    add si, 4
    add bx, 10h
    loop s0

    mov bx, 0    ;存收入
    mov si, 14h
    mov cx, 5
s1:mov ax, [si]
    mov es:[bx+5], ax
    mov ax, 0
    mov es:[bx+5+2], ax
    add si, 2
    add bx, 10h
    loop s1

    mov bx, 0    ;存雇员数    
    mov si, 1eh
    mov cx, 5
s2:mov ax,[si]
    mov es:[bx+0ah], ax
    add si, 2
    add bx, 10h
    loop s2

    mov bx, 0    ;求商
    mov cx, 5
s3:mov ax, es:[bx+5]
    mov dx, es:[bx+5+2]
    div word ptr es:[bx+0ah]
    mov es:[bx+0dh], ax
    add bx, 10h
    loop s3
    
    mov ah, 4ch
    int 21h
code ends
end start

 实验效果截图:

 (对于收入只有两个字节的情况,我将高位存入00填满4个字节)

 

 

 

8.实验总结

  本次实验,我充分认识到了汇编语言的繁琐性,也进一步懂得了汇编语言代码书写的规范。例如在实验任务2,我多次出现severe error的情况,后来发现是mov ax, b800h,在b800h前没有加0。

在汇编语言中规定:数值的字面书写一律不以字母开头,若以字母开头就认为不是数字而是符号。b800被认为是符号,必须加0让汇编程序认为他是数值。同时我也懂得了如何实现二次循环等方法。

实验8也是多次循环输出结果,同时也搞清了各个数据占的位数和字节数。

 

 

 

 

这篇关于实验2 多个逻辑段的汇编源程序编写与调试的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!