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

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

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

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

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

 

  任务1-3

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

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

 

  任务1-4

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

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

运行结果:

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

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

 

 

 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

运行结果:

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

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

 

 

 

 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

运行结果:

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

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

 

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

运行结果:

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

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

 

 问题3:line19作用:

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

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

  运行结果:db  5 dup(2)实验2 多个逻辑段的汇编源程序编写与调试

db 5 dup(5)实验2 多个逻辑段的汇编源程序编写与调试

 

 

 

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

 

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

运行结果:

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

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

 

 

 

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

运行结果:

  代码:

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

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

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

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

 

   结果:

  执行前:

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

40~80显示为空格

   执行后:

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

 

 

 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指令的运用;

上一篇:[Leetcode]16.机器人的运动范围


下一篇:寄存器梳理