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

2021/11/8 17:11:10

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

实验任务1

1-1

对程序task1_1.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。

task1_1.asm

 

 

 

 

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

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

 

任务1-2

对程序task1_2.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。

task1_2.asm

 

 

 

 

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

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

 

任务1-3

对程序task1_3.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。

task1_3.asm

 

 

 

 

 

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

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

 

任务1-4

 

对程序task1_4.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。

task1_4.asm

 

 

 

 

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

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

 

任务1-5

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

① 对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是  _(1)能整除时,为N(2)不能整除时,为N+16_。

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

task1_4仍然可以正确执行。没有了伪指令,exe文件被加载在内存中,首先将CS:IP指向程序的首地址。而只task1_4的程序中一开始定义的是代码段,所以CS:IP指向了指令的首地址。task1_1-1_3的程序中一开始定义的是数据段,所以cs:ip指向了数据的首地址而非指令,而CPU会把数据段中的数据当中机器指令来执行。

实验任务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, 50h
s:  mov [bx], 0403h
   add bx, 2
   loop s
   mov ah, 4ch
   int 21h
code ends
end

 

 实验任务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 ss, ax
     mov ax, data2
     mov es, ax
     mov ax, data3
     mov ds, ax
     mov bx, 0
 
     mov cx, 10
   s:mov al, ss:[bx]
     add al, es:[bx]
     mov [bx], al
     add bx, 1
     loop s
 
     mov ah, 4ch
     int 21h
 code ends
end start

首先查看之前data1和data2内容

 

 

这是循环之后相加的结果,可知data1和data2相加存到了data3中。

 

 

实验任务4

 源代码:

assume cs:code, ss:data1, ds:data2

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

    mov cx, 8
  s:push [bx]
    add bx, 2
    loop s

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

 

用d命令查看循环执行前后的内存空间,发现data1的内容确实被逆序复制到了data2处。

 

 

 

 实验任务5

调试结果:出现彩色NUIST

 

 

2.Line 19 的作用:将小写字母转换成大写字母

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

实验结果:NUIST变成绿色

 

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

实验结果:NUIST变成紫色

 

 数值的作用可能是设置不同的颜色

 实验任务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

源代码:

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 si,0
    mov bx,0
s: mov ax,[si]
    mov es:[bx],ax   ;输入19
    mov ax,[si+2]
    mov es:[bx+2],ax   ;输入年份中后两位
    add bx,10h
    add si,4
    loop s   

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

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

   mov cx,5
   mov si,5
s3:mov ax,es:[si]
     mov bl,es:[si+5]
     div bl
     mov es:[si+8],al
     add si,16
     loop s3   
    mov ah, 4ch
    int 21h
code ends
end start

 

 

 



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


扫一扫关注最新编程教程