ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-11-06 02:00:53  阅读:151  来源: 互联网

标签:汇编 code data mov si ax bx 源程序 调试


一、实验目的   1. 理解和掌握8086多个逻辑段的汇编源程序   2. 理解和熟练应用灵活的寻址方式   3. 通过汇编指令loop的使用理解编程语言中循环的本质,掌握其在嵌套循环中的正确使用   4. 掌握使用debug调试8086汇编程序的方法 二、实验准备   复习教材5-8章:   包含多个逻辑段的汇编源程序结构   寻址方式   汇编指令loop, div用法 三、实验内容 1.实验任务1   任务1-1

DS=076A;SS=076B;CS=076C;data=x-2;stack=x-1;(每段16个字节)

DS=076A;SS=076B;CS=076C;data=x-2;stack=x-1;(每段16字节)

 

  任务1-3

DS=076A;SS=076B;CS=076C;data=x-4;stack=x-2;(每段32字节)

 

  任务1-4

DS=076C;SS=076E;CS=076A;data=x+2;stack=x+4;(ds-076c,ss-076e)

 

  任务1-5

  问题1:实际分配空间为16*(N/16向上取整),总是为16的倍数。

  问题2:task1-4可以运行,因为start指明了代码段的起始位置,end后去除start后自动从程序开头执行;而只有1-4中指令从程序开头开始,其他为数据段开始会错误识别成指令,无法执行;

 

2.实验任务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
    mov ax,0403h
s:    mov ds:[bx],ax
    add bx,2
    loop s

    mov ah,4ch
    int 21h

code ends
end start

运行结果:

 

 

 3.实验任务3

编程实现把逻辑段data1和逻辑段data2的数据依次相加,结果保存到逻辑段data3中。
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 ds,ax

    mov bx,0
    mov cx,10
s:    mov ax,[bx]
    add ax,[bx+10h]
    mov [bx+20h],ax
    inc bx
    loop s

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

运行结果:

 

 

 

 data1-0000; data2-0010; data3-0020;

4.实验任务4

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  ;data1为数据段
    mov ds,ax
    mov ax,data2  ;data2为栈段,长度与data1相同
    mov ss,ax
    mov sp,10h
    
    mov bx,0
    mov cx,8
s0: push ds:[bx]  ;全部入栈后栈顶为data2的段首,data2正好为data1的逆序存放
    add bx,2
    loop s0


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

运行结果:

 

5.实验任务5

代码分析:

assume cs:code, ds:data
data segment
        db 'Nuist'
        db 1, 2, 3, 4, 5
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]  ;al逐个赋值data第一行的一个字母
        and al, 0dfh  ;0dfh=0000 1101 1111,相与运算将小写字母ASCII值减32变为大写字母
        mov es:[di], al
        mov al, [5+si]  ;al赋值data第二行数字
        mov es:[di+1], al  ;插入到字母后面
        inc si
        add di, 2
        loop s

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

运行结果:

 

 问题3:line19作用:

0dfh=0000 1101 1111,相与运算将小写字母ASCII值减32变为大写字母

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

  运行结果:db  5 dup(2)

db 5 dup(5)

 

 

 

 结论:改变其前面字母的颜色;

 

6.实验任务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 es,ax

    mov di,0
    mov cx,4
s0:    mov bx,cx  ;嵌套循环,外循环cx值保存在bx中

    mov si,di
    mov cx,4  ;内循环对没行前四个字母操作
s1:    mov al,es:[si]
    or al,20h  ;或运算20h=0010 0000 大写的字母ASCII码值加32变小写
    mov es:[si],al
    inc si
    loop s1

    add di,10h
    mov cx,bx  ;内循环结束,cx赋值外循环的计数
    loop s0
    
    mov ah, 4ch
    int 21h
code ends
end start

运行结果:

 

 

 

7.实验任务7

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 cx,5
    mov bx,0
    mov si,0
s0:    mov ax,[bx]  ;s0传入年份
    mov es:[si+0],ax
    mov ax,[bx+2]
    mov es:[si+2],ax
    add bx,4
    add si,10h
    loop s0

    mov cx,5
    mov bx,14h
    mov si,0
s1:    mov ax,[bx]  ;s1传入收入
    mov es:[si+5],ax
    mov ax,[bx+2]
    mov es:[si+7],ax
    add bx,4
    add si,10h
    loop s1

    mov cx,5
    mov bx,28h
    mov si,0
s2:    mov ax,[bx]  ;传入雇员
    mov es:[si+10],ax
    add bx,2
    add si,10h
    loop s2

    mov cx,5
    mov si,0
s3:    mov ax,es:[si+5]  ;计算人均收入,32收入低位ax
    mov dx,es:[si+7]  ;32收入高位dx
    mov bx,es:[si+10]  ;雇员
    div bx
    mov es:[si+13],ax  ;取商放在ax中
    add si,10h
    loop s3

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

运行结果:

  代码:

 

   结果:

  执行前:

40~80显示为空格

   执行后:

 

 

 40~80前四列显示为年份,6~9列值列为收入,11,12列值为雇员,14,15列值为均收入;

结果表:

  1~4年份 6~9收入 11,12雇员 14,15均收入
40 1975 0010h 03 05
50 1976 0016h 07 03
60 1977 017eh 09 2a
70 1978 054ch 0d 68
80 1979 0956h 1c 55

 

 

 

 

 

 

 

四、实验总结

  通过本次实验,我学习了伪指令start的作用;多段程序的内存分配方式;利用字符前数字改变字符颜色;利用与或运算改变字符大小写;div指令的运用;

标签:汇编,code,data,mov,si,ax,bx,源程序,调试
来源: https://www.cnblogs.com/purhuman/p/15515846.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有