实验3 多个段的汇编源程序编写与调试

实验结论

实验任务1

assume cs:code, ds:data
data segment
        db 'Nuist'
        db 5 dup(2)
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
代码功能逐行解释:
mov cx, 5 //设置循环次数为5次 mov si, 0 //设置偏移量,这是设置数据段ds的偏移地址 mov di, 0f00h //设置es的偏移地址 s: mov al, [si] //将ds:[si]一个字节的内容存入al and al, 0dfh //将字母大写 mov es:[di], al //将al里的数据存入附加段里面去,这里存入的是数据信息 mov al, [5+si] //将ds:[5+si]存入al mov es:[di+1], al //再次存入到附加段里面去 inc si //si自加 add di, 2 //附加段的偏移地址加2,移动一个字的单位 loop s //循环

使用masm、link对task1.asm进行汇编、链接

执行task1.exe后,屏幕上出现如下图像:

 

 

使用debug工具对程序进行测试,执行到程序返回前,即line27之前,观察结果。

 

 

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

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

 

 

这里的数值作用是代表的颜色信息。

实验任务2

task2.asm代码:

 assume cs:code,ds:data
 data segment
     db 23,50,66,71,35
 data ends
 code segment
 start:
     mov ax,data
     mov ds,ax     
     mov cx,5
     mov bx,0     
s:  mov ah,0
     mov al,ds:[bx]
     mov dl,10
     div dl
     
     mov ds:[5],al
     mov ds:[6],ah     
     mov ah,2
     mov dl,ds:[5]
     add dl,30h
     int 21h
     mov ah,2
     mov dl,ds:[6]
     add dl,30h
     int 21h     
     mov dl,32
     int 21h     
     inc bx
     loop s
     
     mov ax,4c00h
     int 21h
code ends
end start

使用masm、link工具对task2.asm进行汇编和链接

 

 

执行task2.exe,运行结果显示如下:

成功输出五个数

实验任务3

task3.asm源代码:

assume cs:code, ds:data, ss:stack
data segment
  dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
data ends

stack segment
  dw 0, 0, 0, 0, 0, 0, 0, 0
stack ends

code segment
start:  mov ax,stack
        mov ss, ax
        mov sp,16
        
        mov ax, data
        mov ds, ax
        
        push ds:[0]
        push ds:[2]
        pop ds:[2]
        pop ds:[0]
        
        mov ax,4c00h
        int 21h
code ends
end start

使用masm、link工具对task3.asm进行汇编和链接

①CPU执行程序,程序返回前,data段中的数据:0123H, 0456H, 0789H, 0ABCH, 0DEFH, 0FEDH, 0CBAH, 0987H

 

 

②CPU执行程序,程序返回前,cs=076CH,ss=076BH,ds=076AH

③设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1

实验任务4

task4.asm源代码:

assume cs:code, ds:data, ss:stack
data segment
  dw 0123h, 0456h
data ends

stack segment
  dw 0, 0
stack ends

code segment
start:  mov ax,stack
        mov ss, ax
        mov sp,16
        
        mov ax, data
        mov ds, ax
        
        push ds:[0]
        push ds:[2]
        pop ds:[2]
        pop ds:[0]
        
        mov ax,4c00h
        int 21h

code ends
end start

①CPU执行程序,程序返回前,data段中的数据为0123H,0456H,0......

 

 

 

 

②CPU执行程序,程序返回前,可以得出cs=076CH,ss=076BH,ds=076AH,而ds里的数据没有发生变化

③设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1

④如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为(floor(N/16)+1)*16。

最少占用16个字节,然后以16的倍数增加,16 32 48

实验任务5

task5.asm源代码:

assume cs:code, ds:data, ss:stack

code segment
start:  mov ax,stack
        mov ss, ax
        mov sp,16
        
        mov ax, data
        mov ds, ax
        
        push ds:[0]
        push ds:[2]
        pop ds:[2]
        pop ds:[0]
        
        mov ax,4c00h
        int 21h

code ends
data segment
  dw 0123h, 0456h
data ends

stack segment
  dw 0,0
stack ends
end start

对task5.asm进行汇编和链接

 

 

①CPU执行程序,程序返回前,data段中的数据为0123H ,0456H

 

 

②CPU执行程序,程序返回前,cs=076AH,ss=076EH,ds=076DH

查看ds里的数据没有发生变化

 

 

③设程序加载后,code段的段地址为X,则data段的段地址为X+3,stack段的段地址为X+4

实验任务6

只有第三个程序能够正确执行。将“end start”改为“end”数据段与栈段的数据当作程序运行出错,

而第三个程序的 data 段与 stack 段处于 code 之后,默认执行的起点就是 code 段的内容,能够正确执行。

实验任务7

task7.asm源代码:

assume cs:code
a segment
  db 1,2,3,4,5,6,7,8
a ends
b segment
  db 1,2,3,4,5,6,7,8
b ends
c segment 
  db 8 dup(0)
c ends
code segment
start:
        mov ax,a
        mov ds,ax
        mov si,0
        mov cx,9
s:      mov ax,0
        mov al,[si]
        add al,[si+16]
        mov [si+32],al
        inc si
        loop s
        mov ah,4ch
        int 21h       
code ends
end start

将c1段地址给es,查看es结果,已经完成相加:

实验任务8

assume cs:code
a segment
  dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends
b segment
  dw 8 dup(0)
b ends
code segment
start: 
        mov ax,b
        mov ss,ax
        mov sp,10h
        mov ax,a
        mov ds,ax
        mov si,0
        mov cx,9
s:      push ds:[si]
        add si,2
        loop s
        mov ah,4ch
        int 21h
code ends
end start

先反汇编,再输出结果:

可以看到,已完成逆序存储

posted @ 2020-11-26 22:31  schedinger  阅读(132)  评论(1)    收藏  举报