首页 > 其他 > 详细

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

时间:2020-11-26 22:31:29      阅读:38      评论:0      收藏:0      [点我收藏+]

1.实验任务1

源代码文件task1.asm

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里调试到程序返回前的截图:

技术分享图片

 

技术分享图片

 

 

技术分享图片

 

 

技术分享图片

 

 技术分享图片

 

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

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

技术分享图片

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

控制显示字符的颜色

2. 实验任务2

已知数据段data中定义字节数据如下:

1 data segments
2 db 23, 50, 66, 71, 35
3 data ends

编写程序,在屏幕上以十进制整数形式打印输出这5个两位数。

源代码文件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 si, 0
        mov cx,5
s:      mov ax,0
        mov al, [si]
        mov bl,10
        div bl  ;利用除法指令div,计算出每个数位上的数值
        mov bx,ax
        add bl,48  ;将十位数值转换成数字字符
        add bh,48  ;将个位数值转换成数字字符

        mov dl,0
        mov ah,2
        mov dl,bl
        int 21h  ;利用系统调用int21h中的2号子功能,输出十位字符

        mov ah,2
        mov dl,bh
        int 21h  ;输出个位字符

        mov ah,2
        mov dl,32
        int 21h  ;输出空格
        inc si
        loop s

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

运行结果截图

技术分享图片

 

 

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

①cpu执行程序,程序返回前,data段中的数据为多少?

   data段不变

②cpu执行程序,程序返回前,cs=076ch,ss=076bh,ds=076ah。

技术分享图片

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

4. 实验任务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段中的数据为多少?

  data段不变

②cpu执行程序,程序返回前,cs=076ch,ss=076bh,ds=076ah。

技术分享图片

 

 

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

④对于如下定义的段

1 name segment
2  ...
3 name ends

如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为____。

 (N/16-1)*16+16个字节

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

①cpu执行程序,程序返回前,data段中的数据为多少?

  data段不变

②cpu执行程序,程序返回前,cs=076ch,ss=076bh,ds=076ah。

技术分享图片

 

 

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

6. 实验任务6

如果将task3,task4,task5中的最后一条伪指令“end start"改为”end",则哪个程序仍然可以正确执行?请说明原因

答:task5可以正确执行,“end start”的作用是指明程序的入口,若不指明程序入口,CPU则将按顺序执行,在内存中数据和指令都是以数据的形式存储,CPU无法自动识别哪些是指令哪些是数据,task3,task4在code段前都有数据段,据段的数据会被当成指令被编译执行,虽然可能也会正确运行但会产生一些错误,task5中code段位于开头,按顺序执行可以正确执行。

验证:

技术分享图片

 

 

由上图可知,只有task63正确执行。

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

c1 segment   ; 在集成软件环境中,请将此处的段名称由c→改为c1或其它名称
  db 8 dup(0)
c1 ends

code segment
start:
    mov ax,a
    mov ds,ax

    mov ax,c1
    mov es,ax

    mov bx,0
    mov cx,8
s:  mov ax,0
    add al,[bx]
    add al,[bx+16]
    mov es:[bx],al
    inc bx
    loop s

    mov ax,4c00h
    int 21h
code ends
end start

在debug环境中,执行到程序返回前,查看逻辑段c的数据:

原始:

技术分享图片

 

 执行后:

技术分享图片

 

 

8. 实验任务8

完整源代码文件task8.asm

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,a
       mov ds,ax
       mov ax,b
       mov ss,ax
       mov sp,16

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

       mov ax,4c00h
       int 21h
code ends
end start

在debug环境中,执行到程序返回前,查看逻辑段c的数据

执行前:

技术分享图片

执行后:

技术分享图片

 

 

 

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

原文:https://www.cnblogs.com/christian666/p/14044027.html

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