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

1. 实验任务1

1_1:① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) =076a, 寄存器(SS) =076b, 寄存器(CS) =076c

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

 

1_2:① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) =076a, 寄存器(SS) =076b, 寄存器(CS) =076c

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

 

1_3:① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) =076a, 寄存器(SS) =076b, 寄存器(CS) =076c

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

 

1_4:① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) =076c, 寄存器(SS) =076e, 寄存器(CS) =076a

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

 

1_5:① 对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是 16个字节。

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

答:task1_5可以执行,因为“end start”改为“end”,则程序不能识别 start,会从程序开头,数据段和栈段开始执行,不是从程序代码开始,数据段和栈段所代表的代码则是乱码;task1_1task1_2task1_3的第一行都是定义的数据段,没有相应的指令,程序将会发生错误。

 

2. 实验任务2

(1)汇编源码:

 

assume cs:code

  code segment

      mov ax, 0b800h

      mov ds, ax

      mov bx, 0f00h

  mov cx, 50h

      mov ax, 0403h

  

 s:  mov ds:[bx], ax

     add bx, 2

     loop s

     

     mov ah, 4ch

     int 21h

 code ends

 end

 

运行结果截图:

 

 

3. 实验任务3

(1) 补充完整后的汇编源代码

assume cs:code ds:data1 ds:data2 ds:data3d

 

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 dx,0

mov cx,10

s:

   mov dx,0

   

   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 ah, 4ch

int 21h

 

code ends

end start

 

(2) debug中加载、反汇编、调试截图 

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

 

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

 

4. 实验任务4

(1)补充完整后的汇编源代码 

assume cs:code

data1 segment
    dw 2,0,4,9,2,0,1,9
data1 ends

data2 segment
    dw 8 dup(0)
data2 ends

code segment
start:
    mov ax,data1
    mov ds,ax
      mov ax,data2
      mov ss,ax
      mov sp,16
      mov cx,8
      mov bx,0
      
  s:  mov ax,[bx]
      push ax
      add bx,2
  loop s       
    
    mov ah,4ch
    int 21h
code ends
end start

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

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

 

5. 实验任务5

(1)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

(2)运行结果截图

 

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

 

(4)源代码中line19的作用是?

Line19的作用是将’Nuist’中的小写字母改为大写。

(5)源代码中data段line4的字节数据的用途是? 

Line4的作用是改变输出的颜色。

 
6. 实验任务6

(1)task6.asm源代码 

assume cs:code, ds:data 
data segment 
    db 'Pink Floyd      ' ; 16字节 
    db 'JOAN Baez       ' ; 16字节 
    db 'NEIL Young      ' ; 16字节 
    db 'Joan Lennon     ' ; 16字节 
data ends
 
code segment 
start: 
      mov ax,data
      mov ds,ax
      mov bx,0
      mov cx,4
      
  s:      
      mov al,ds:[bx]
      or al,0020h
      mov ds:[bx],al
      add bx,16
      loop s 
      
      mov ah, 4ch 
      int 21h 
code ends 
end start

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

 

 

 

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

 

 

7. 实验任务7

(1) task7.asm源码 

assume cs:code, ds:data, es:table 
data segment 
    db '1975', '1976', '1977', '1978', '1979' 
    dd 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 bx,0
    mov bp,0
    mov cx,5
s:  
    mov ax,ds:[bx]
    mov dx,ds:[bx+2]
    mov es:[bp],ax
    mov es:[bp+2],dx
    mov byte ptr es:[bp+4],' '
    add bx,4
    add bp,10h
    loop s 

    mov bp,0
    mov cx,5
s1: mov ax,ds:[bx]
    mov dx,ds:[bx+2]
    mov es:[bp+5],ax
    mov es:[bp+7],dx
    mov byte ptr es:[bp+9],' '
    add bx,4
    add bp,10h
    loop s1
    
    mov bp,0
    mov cx,5
s2: mov ax,ds:[bx]
    mov es:[bp+0ah],ax
    mov byte ptr es:[bp+0ch],' '
    add bx,2
    add bp,10h
    loop s2

    mov bp,0
    mov cx,5
s3: mov ax,es:[bp+5]
    mov dx,es:[bp+7]
    div word ptr es:[bp+0ah]
    mov es:[bp+0dh],ax
    mov byte ptr es:[bp+0fh],' '
    add bp,10h
    loop s3
    
    mov ah, 4ch 
    int 21h 
code ends 
end start

(2)调试截图

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

 

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

 

 

 

posted @ 2021-11-06 15:58  YP_bug  阅读(84)  评论(1)    收藏  举报