首页 > 其他 > 详细

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

时间:2020-11-27 09:42:37      阅读:38      评论:0      收藏:0      [点我收藏+]
一、实验目的
1. 理解和掌握将数据、代码、栈放入不同逻辑段的程序的编写和调试
2. 理解具有多个段的汇编源程序对应的目标程序执行时,内存分配方式
3. 掌握大小写字符的转换方法、数字字符和数值之间的转换方法
4. 理解并掌握各种寻址方式的灵活应用
5. 掌握汇编指令loop, and, or,div, mul的用法
二、实验准备
复习教材chapter 6-8章。
chapter 6 包含多个段的程序
chapter 7 更灵活的定位内存地址的方法
chapter 8 数据处理的两个基本问题
三、实验内容
四、实验结论
任务一:
源代码:
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
编译链接运行:
技术分享图片

 debug:

技术分享图片

技术分享图片

源代码中data段line4的字节数据改为  dp 1,2,3,4,5  编译链接运行:
技术分享图片
分析源代码中data段line4的字节数据的用途是?
  控制字符颜色;
 
任务二:
源代码:
assume cs:code, ds:data
data segment
    db 23, 50, 66, 71, 35
    db 10 dup(0)
data ends
code segment
start:
          mov ax, data
          mov ds, ax
          mov cx,5
          mov si,0

s:        mov ah,0
          mov al, ds:[si]
          mov bl, 10
          div bl
          mov ds:[si+5],al
          mov ds:[si+6],ah
          mov ah, 2
          mov dl,ds:[si+5]
          add dl, 30h
          int 21h 
          mov ah, 2
          mov dl, ds:[si+6]
          add dl, 30h
          int 21h
          inc si
          mov ah, 2
          mov dl, 32
          int 21h
          loop s
         
          mov ah, 4ch
          int 21h  
  code ends
  end start

 编译链接运行:

技术分享图片

 

任务三:
源代码:
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

①cpu执行程序返回前,data段中的数据为多少:data段不变.

技术分享图片

②cpu执行程序返回前,cs=04B0h,ss=04AF,ds=04AEh。

技术分享图片

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

 

任务四:

源代码:

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段中的数据为多少:data段不变

②cpu执行程序返回前,cs=04B0h,ss=04AFh,ds=04AEh。

技术分享图片

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

④观察发现该实验与上一个实验分配的字节数一样,说明系统仍然分配了20h个字节空间。所以推测得到若段中的数据不足16个字节的倍数,系统会自动扩到16个字节为单位大的数据。 所以书上应该填:((N+15)/16)*16。

 

任务五:

源代码:

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

①cpu执行程序返回前,data段中的数据为多少:data段不变。

技术分享图片

②cpu执行程序返回前,cs=04AEh,ss=04B2h,ds=04B1h。

技术分享图片

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

 

任务六:

答:第三个程序可以正确执行,前面俩个程序不能直接执行指令,而第三个开头是代码即汇编指令段,可以正常执行。

 

任务七:

源代码:

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 ax,c
    mov es,ax
    
    mov bx,0
    mov cx,8
    
s:    
    mov ax,0
    mov al,ds:[bx]
    add al,ds:[bx+16]
    mov es:[bx],al
    inc bx
    loop s

    mov ax,4c00h
    int 21
    
code ends
end start

技术分享图片

技术分享图片

 

任务八:

源代码:

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,16

    mov ax,a
    mov ds,ax
    mov bx,0

s:    push ds:[bx]
    add bx,2
    loop s
    
    mov ax,4c00h
    int 21h
code ends
end start

技术分享图片

技术分享图片

 

 

五、实验总结 

1)掌握了除法指令div

 

2)int 21h中的2号子功能: 可以输出单个字符

1 mov ah, 2
2 mov dl, ×× ; ××是待输出的字符,或其ASCⅡ码值
3 int 21h

3)深知了ASCII码的应用

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

原文:https://www.cnblogs.com/yzh-privateBlog/p/14045110.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!