201983290333左智实验2

1. 实验任务1

1-1)task1_1.asm源码

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

data segment
    db 16 dup(0)
data ends

stack segment
    db 16 dup(0)
stack ends
code segment
start:
    mov ax, data
    mov ds, ax

    mov ax, stack
    mov ss, ax
    mov sp, 16

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

task1_1调试到line17结束、line19之前截图

201983290333左智实验2

 

 

问题回答

 ①

Ds 076a ss076b cs 076c

data:X-2 stack:X-1

 

 

1-2)

任务task1_2.asm源码

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

data segment
    db 4 dup(0)
data ends

stack segment
    db 8 dup(0)
stack ends
code segment
start:
    mov ax, data
    mov ds, ax

    mov ax, stack
    mov ss, ax
    mov sp, 8

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

task1_2调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图

201983290333左智实验2

 

 

 问题回答

 ①

Ds=076a ss=076b cs=076c

data:X-2 stack:X-1

 

1-3)

任务task1_3.asm源码

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

data segment
    db 20 dup(0)
data ends

stack segment
    db 20 dup(0)
stack ends
code segment
start:
    mov ax, data
    mov ds, ax

    mov ax, stack
    mov ss, ax
    mov sp, 20

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

task1_3调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图

201983290333左智实验2

 

 问题回答

 ①

Ds 076a ss 076c cs 079e

data:X-4 stack:X-2

 

1-4)

任务task1_4.asm源码

assume ds:data, cs:code, ss:stack
code segment
start:
    mov ax, data
    mov ds, ax

    mov ax, stack
    mov ss, ax
    mov sp, 20

    mov ah, 4ch
    int 21h
code ends

data segment
    db 20 dup(0)
data ends

stack segment
    db 20 dup(0)
stack ends
end start

task1_4调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图

201983290333左智实验2

 

 

 问题回答

 ①

Ds076c ss 076e cs 076a

data:X-2 stack:X+2

 

1-5)

(N/16+1)*16字节,N/16,表示N除以16取整

Task1_4.asm可以正常执行,因为开头就是程序。

 

2. 实验任务2

源代码:

assume cs:code
code segment
    mov ax, 0b800h
    mov ds, ax
    
    mov bx, 0f00h
    mov ax, 0403h
    mov cx, 80
m:  mov [bx], ax
    add bx, 2
    loop m
    
    mov ah, 4ch
    int 21h
code ends
end

结果:

201983290333左智实验2

 

 

 

 

3. 实验任务3

补充完整后的汇编源代码

db 50, 48, 50, 50, 0, 48, 49, 0, 48, 49 ; ten numbers
db 0, 0, 0, 0, 47, 0, 0, 47, 0, 0       ; ten numbers
db 1,2,3,4,5,6,7,8,9,a
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 bx,0;偏移量
    mov dx,0;求和寄存器
    mov cx,a
s:    mov dx,0 ;每次循环要清零
    mov ax,data1 ;data1段数据加到dl
    mov ds,ax
    add dl,[bx]

    mov ax,data2 ;data2段数据加到dl
    mov ds,ax
    add dl,[bx]

    mov ax,data3  ;dl数据到data3段中
    mov ds,ax
    mov [bx],dl

    inc bx;自加
    loop s    

    mov ax,4c00h
    int 21h

code ends
end start

201983290333左智实验2

 

 

 

在数据项依次相加之前,查看逻辑段data1, data2, data3对应的内存空间数据原始值的 debug命令和截图:

 

 201983290333左智实验2201983290333左智实验2201983290333左智实验2

 

相加之后:

201983290333左智实验2201983290333左智实验2

 

 

 

4. 实验任务4

补充完整后的汇编源代码

assume cs:code

data1 segment
    dw 2, 0, 4, 9, 2, 0, 1, 9;0-f
data1 ends 

data2 segment
    dw 8 dup(?);10-25
data2 ends

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

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


    mov ax,data2
    mov ds,ax

    mov bx,0
    mov cx,8
s2:    pop ds:[bx]
    add bx,2
    loop s2

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

在debug中加载、反汇编、调试截图

201983290333左智实验2

 

在程序退出前,使用d命令查看数据段data2对应的内存空间的截图

 

 

 201983290333左智实验2

 

 

5. 实验任务5

task5.asm源码

assume cs:code, ds:data
data segment
        db 'Nuist'
        db 2, 3, 4, 5, 6
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

运行结果截图:

201983290333左智实验2

 

 

 使用debug工具对程序进行调试,使用g命令一次性执行到程序返回前(即ine25执行之后、line27 执行之前)的截图

201983290333左智实验2

 

源代码中line19的作用是:

代码line19的作用是将所有字母转换为大写字母

 

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

可能是控制颜色

 

 

6. 实验任务6

 task6.asm源代码

 

 

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 ds,ax
    mov cx,4;4行单词
    mov bx,0
s:    
    mov dx,cx;切记保存cx,不然程序会异常不结束
    mov cx,4;4个字母
    mov si,0
    p:
        mov al,ds:[bx+si]
                or al,00100000B
                mov ds:[bx+si],al
                inc si
          loop p
    add bx,16
    mov cx,dx;
   loop s
   mov ah, 4ch
   int 21h
code ends
end start

在debug中加载、反汇编、调试截图:

201983290333左智实验2

 

 在程序退出前,使用d命令查看数据段data对应的内存空间的截图:

201983290333左智实验2

 

 

 

7. 实验任务7 

 task7.asm源码

assume cs:code, ds:data, es:table

data segment
    db '1975', '1976', '1977', '1978', '1979' ;7519 7619 20个字节
    dw  16, 22, 382, 1356, 2390 ;20+5*2
    dw  3, 7, 9, 13, 28 ;30
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
    mov di,0
s:  mov ax,[bx+2]                      ;因为19是高位
    mov es:[di+2],ax          
    mov ax,[bx]                           ;75这类是低位,存储在低位
    mov es:[di],ax

    mov ax,[si+20]                      ;取收入
    mov es:[di+5],ax                   ;收入放到table中

    mov ax,[si+30]                      ;取人数
    mov es:[di+10],ax                 ;放到table中

    mov ax,[si+20]                     ;被除数放在ax里面
    mov dl,[si+30]
    div dl
    mov es:[di+13],al                  ;结果保存在ax,把结果移入到table中

    add bx,4
    add si,2
    add di,16
    loop s


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

查看table段原始数据信息截图:

201983290333左智实验2

 

 在debug中运行到程序退出之前,使用d命令查看table段对应的内存空间的截图,确认信息是 否按要求结构化地写入到指定内存:

201983290333左智实验2

 

上一篇:MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用


下一篇:Tp5.1 简单实现对null值排序