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

2021/11/7 22:12:55

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

四、实验结论

 1. 实验任务1

 任务1-1 task1_1.asm源码 task1_1调试到line17结束、line19之前截图 问题回答

① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = __0770__, 寄存器(SS) = ___0771_, 寄存器(CS) = ___0772_

② 假设程序加载后,code段的段地址是X,则,data段的段地址是__X-2__, stack的段地址是 ___X-1_。

任务1-2 任务task1_2.asm源码 task1_2调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图 问题回答

① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = __0770__, 寄存器(SS) = __0771__, 寄存器(CS) = __0772__

 ② 假设程序加载后,code段的段地址是X,则,data段的段地址是__X-2__, stack的段地址是 ___X-1_。

任务1-3 任务task1_3.asm源码 task1_3调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图 问题回答

① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = __0770, 寄存器(SS) = _0772__, 寄存器(CS) = ___0774_

② 假设程序加载后,code段的段地址是X,则,data段的段地址是___X-4_, stack的段地址是 __X-2__。

任务1-4 任务task1_4.asm源码 task1_4调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图 问题回答

① 在debug中将执行到line9结束、line11之前,记录此时:寄存器(DS) = _0772, 寄存器(SS) = __0774__, 寄存器(CS) = __0770

② 假设程序加载后,code段的段地址是X,则,data段的段地址是__X+2__, stack的段地址 是_X+4___。

任务1-5 基于上述四个实验任务的实践、观察,总结并回答:

① 对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是 ___[N/16]+1_。

② 如果将程序task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm中,伪指令 end start 改成 end , 哪一个程序仍然可以正确执行。结合实践观察得到的结论,分析、说明原因。

只有task1_4.asm可以正确运行,原因是只有task1_4.asm的数据段

data segment

    db 20 dup(0)

data ends

 

stack segment

    db 20 dup(0)

stack ends 

在   start:

      ……

end  之间 。 只有数据段在程序之中才可以正常的运行。

 2. 实验任务2

汇编代码:

assume cs:code
code segment
        mov ax,0b800H
        mov ds,ax
        mov bx,0f00H
        mov ax,0304H
        mov cx,50H
s:      mov [bx],ax
        add bx,2
        loop s
        mov ah,4ch
        int 21h
code ends
end

截图:

 

 3. 实验任务3

汇编代码:

assume cs:code
data1 segment
db 50, 48, 50, 50, 0, 48, 49, 0, 48, 49 ; ten numbers
data1 ends
data2 segment
db 0, 0, 0, 0, 47, 0, 0, 47, 0, 0 ; ten numbers
data2 ends
data3 segment
db 16 dup(0)
data3 ends
code segment
start:
    mov ax,data1
    mov ds,ax
    mov bx,0
    mov cx,10
s:  mov ax,[bx]
    add ax,[bx+10h]
    mov [bx+20h],ax
    inc bx
    loop s
    
mov ah, 4ch
int 21h
code ends
end start

截图:

反汇编:

 

相加前:

 

 

运行相加后,逻辑段data1和逻辑段data2的数据依次相加,结果保存到逻辑段data3中,见076A:0030后的数据段。

 

 

4. 实验任务4

汇编代码:

assume cs:code
data1 segment
dw 2, 0, 4, 9, 2, 0, 1, 9
data1 ends
data2 segment
dw 8 dup(?)
data2 ends
code segment
start:
mov ax,data2
  mov ss,ax
  mov sp,10h
  mov ax,data1
  mov ds,ax
  mov bx,0
  mov cx,8
s:  push [bx]
    add  bx,2
   loop s
mov ah, 4ch
int 21h
code ends
end start

截图:

 

ds:0 f的数据段为data1,ds:10 1f为把逻辑段data1中的8个字数据逆序存储的结果。

 

5. 实验任务5

汇编代码:

assume cs:code, ds:data
data segment
        db 'Nuist'
         db 5 dup(5)
data ends

code segment
start:
        mov ax, data
        mov ds, ax

        mov ax, 0b800H
        mov es, ax

        mov cx, 5
        mov si, 0
        mov di, 0f00h
s:      mov al, [si]
        and al, 0dfh
        mov es:[di], al
        mov al, [5+si]
        mov es:[di+1], al
        inc si
        add di, 2
        loop s

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

 

 源代码中line19的作用是?     Line 19 的作用:将小写字母转换成大写字母。

 

修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果。

db 2,3,4,5,6 --> 改成: db 5 dup(2) 或 db 5 dup(5)

发现NUIST的颜色改变了

 

 

源代码中data段line4的字节数据的用途是?   Line 4的作用:8位色彩代码,用于定义字体的颜色。

 

6. 实验任务6

汇编代码:

assume cs:code, ds:data

data segment
    db 'Pink Floyd      '
    db 'JOAN Baez       '
    db 'NEIL Young      '
    db 'Joan Lennon     '
data ends

code segment
start:
   mov ax, data
   mov ds, ax

   mov cx, 64
   mov bx, 0
s: or  [bx], byte ptr 20h
   inc bx
   loop s

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

反汇编:

 

 程序运行之前,数据段仍为大写

 

之后,数据段则为小写

 

 

 7. 实验任务7

汇编代码:

assume cs:code, ds:data, es:table

data segment
    db '1975', '1976', '1977', '1978', '1979'
    dw  16, 22, 382, 1356, 2390
    dw  3, 7, 9, 13, 28
data ends

table segment
    db 5 dup( 16 dup(' ') )  ;
table ends

code segment
start:
    mov ax, data
    mov ds, ax
    mov ax, table
    mov es, ax

    mov cx, 5
    mov bx, 0
    mov si, 0
s1: mov ax, [si]
    mov es:[bx], ax
    mov ax, [si+2]
    mov es:[bx+2], ax
    add bx, 16
    add si, 4
    loop s1

    mov cx, 5
    mov bx, 5
    mov si, 20
s2: mov ax, [si]
    mov es:[bx], ax
    mov ax, 0000h
    mov es:[bx+2], ax
    add bx, 16
    add si, 2
    loop s2

    mov cx, 5
    mov bx, 10
    mov si, 30
s3: mov ax, [si]
    mov es:[bx], ax
    add bx, 16
    add si, 2
    loop s3

    mov cx, 5
    mov si, 5
s4: mov ax, es:[si]
    mov bl, es:[si+5]
    div bl
    mov es:[si+8], al
    add si, 16
    loop s4

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

反汇编:

 

先执行到line18:mov es, ax之后,观察ds和es,显示data和table的数据已经载入。

 

 在执行到程序结束,观察es段数据,发现table段对应的内存空间,确认信息已经按要求结构化地写入到指定内存。

 



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


扫一扫关注最新编程教程