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

1.实验任务1

任务1-1 

task1_1.asm源码

task1_1调试到line17结束、line19之前截图

 

 

 问题回答

① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) =   76A  , 寄存器(SS) =  076B  , 寄存器(CS) =   076C  

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

 

任务1-2

任务task1_2.asm源码

task1_2调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图

 

 

 问题回答

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

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

 

任务1-3

任务task1_3.asm源码

task1_3调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图

 

 

 

问题回答 ① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) =076A, 寄存器(SS) = 076C, 寄存器(CS) = 076E

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

 

任务1-4

任务task1_4.asm源码

task1_4调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图

问题回答

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

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

 

任务1-5

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

① 对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是    N/16向上取整   。

xxx segment

db N dup(0)

xxx ends

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

task1_1.asm, task1_2.asm, task1_3.asm报错

task1_4.asm能正确执行

1_4中以代码开始,end可以正常执行

 

2. 实验任务2

编写一个汇编源程序,实现向内存单元b800:0f00 ~ b800:0f9f连续160字节,依次重复填充十六进制数 据03 04。

assume cs:code
code segment
start:
    mov ax, 0b800h
    mov ds, ax
    mov bx, 0f00h
    mov cx, 80
s:  mov [bx], 0403h
    add bx, 2
    loop s
    mov ah, 4ch
    int 21h
code ends
end

 

 

 

3. 实验任务3

补充完整后的汇编源代码

在debug中加载、反汇编、调试截图

要求给出,在数据项依次相加之前,查看逻辑段data1, data2, data3对应的内存空间数据原始值的 debug命令和截图

以及,依次相加之后,查看逻辑段data1, data2, data3对应的内存空间数据原始值的debug命令和 截图

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 bx, 0
    mov cx, 10

  s:mov dx, 0
    mov ax, data1
    mov ds, ax
    add dx, [bx]
    mov ax, data2
    mov ds, ax
    add dx, [bx]

    mov ax, data3
    mov ds, ax
    mov [bx], dx
    inc bx
    loop s
    mov ah, 4ch
    int 21h
code ends
end start

 

 

 

4. 实验任务4 

补充完整后的汇编源代码

在debug中加载、反汇编、调试截图

要求给出,在程序退出前,使用d命令查看数据段data2对应的内存空间的截图。

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, data1
    mov ds, ax
    mov ax, data2
    mov es, ax
    mov ss, ax
    mov sp, 30

    mov bx, 0
    mov cx, 8
s1: push ds:[bx]
    add bx, 2
    loop s1

    mov bx, 0
    mov cx, 8
s2: pop es:[bx]
    add bx, 2
    loop s2
        mov ah, 4ch
        int 21h
code ends
end start
        

运行结果:

 

 

 

5. 实验任务5

task5.asm源码

运行结果截图

assume cs:code, ds:data
data segment
        db 'Nuist'
        db 2, 3, 4, 5, 6
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

 

 

使用debug工具对程序进行调试,使用g命令一次性执行到程序返回前(即ine25执行之后、line27 执行之前)的截图

 

 

源代码中line19的作用是?小写字母转换成大写

源代码中data段line4的字节数据的用途是?设置字体颜色

 

6. 实验任务6

task6.asm源代码

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,4
mov bx,0
s:  
mov dx,cx
mov cx,4
mov si,0
    p:
        mov al,ds:[bx+si]
        or al,00100000B
        mov ds:[bx+si],al
        inc si
        loop p
add bx,16
mov cx,dx
loop s

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

在debug中加载、反汇编、调试截图 要求给出,在程序退出前,使用d命令查看数据段data对应的内存空间的截图。

 

 

 

 7. 实验任务7 t

ask7.asm源码

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

调试截图

查看table段原始数据信息截图

在debug中运行到程序退出之前,使用d命令查看table段对应的内存空间的截图,确认信息是 否按要求结构化地写入到指定内存

 

 

posted @ 2021-11-08 20:31  Aost  阅读(40)  评论(2)    收藏  举报