汇编语言第二次实验

1. 实验任务1

  • 任务1-1

task1_1.asm源码

 1 assume ds:data, cs:code, ss:stack
 2 
 3 data segment
 4     db 16 dup(0) ; 预留16个字节单元,初始值均为0
 5 data ends
 6 
 7 stack segment
 8     db 16 dup(0) ;预留16个字节单元,初始值均为0
 9 stack ends
10 code segment
11 start:
12     mov ax, data
13     mov ds, ax
14 
15     mov ax, stack
16     mov ss, ax
17     mov sp, 16 ; 设置栈顶
18 
19     mov ah, 4ch
20     int 21h
21 code ends
22 end start

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

① 此时(DS)=076A,(SS)=076B,(CS)=076C。

②若程序加载后,code段的段地址是X,则data的段地址是X-32,stack的段地址是X-16。

  • 任务1-2
task1_2.asm源码
 1 assume ds:data, cs:code, ss:stack
 2 data segment
 3     db 4 dup(0) ; 预留4个字节单元,初始值均为0
 4 data ends
 5 
 6 stack segment
 7     db 8 dup(0) ; 预留8个字节单元,初始值均为0
 8 stack ends
 9 code segment
10 start:
11     mov ax, data
12     mov ds, ax
13 
14     mov ax, stack
15     mov ss, ax
16     mov sp, 8 ; 设置栈顶
17 
18     mov ah, 4ch
19     int 21h
20 code ends
21 end start
调试到line17结束、line19之前的截图:

①此时(DS)=076A,(SS)=076B,(CS)=076C。

②若程序加载后,code段的段地址是X,则data的段地址是X-32,stack的段地址是X-16。

  • 任务1-3
task1_3.asm
 1 assume ds:data, cs:code, ss:stack
 2 
 3 data segment
 4     db 20 dup(0)
 5 data ends
 6 
 7 stack segment
 8     db 20 dup(0)
 9 stack ends
10 code segment
11 start:
12     mov ax, data
13     mov ds, ax
14 
15     mov ax, stack
16     mov ss, ax
17     mov sp, 20
18 
19     mov ah, 4ch
20     int 21h
21 code ends
22 end start

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

①此时(DS)=076A,(SS)=076C,(CS)=076E。

②若程序加载后,code段的段地址是X,则data的段地址是X-64,stack的段地址是X-32。

  • 任务1-4
task1_4.asm
 1 assume ds:data, cs:code, ss:stack
 2 code segment
 3 start:
 4     mov ax, data
 5     mov ds, ax
 6 
 7     mov ax, stack
 8     mov ss, ax
 9     mov sp, 20
10 
11     mov ah, 4ch
12     int 21h
13 code ends
14 
15 data segment
16     db 20 dup(0)
17 data ends
18 
19 stack segment
20     db 20 dup(0)
21 stack ends
22 end start
task1_4调试到line9结束、line11之前观察寄存器DS, CS, SS值的截图

①此时(DS)=076C,(SS)=076E,(CS)=076A。

②若程序加载后,code段的段地址是X,则data的段地址是X+32,stack的段地址是X+64

  • 任务1-5

①实际分配给该段的内存空间大小是N%16==0? N : N/16*16+16 个字节

②task1_4仍然可以正确执行。end start指示了程序执行入口,task1_4的代码段在程序开头,end start改成end仍可以正常执行。

 

 2.实验任务2

  • 汇编源代码
 1 assume cs:code
 2 
 3 code segment
 4 start:
 5     mov ax, 0b800h
 6     mov ds, ax
 7     mov bx, 0f00h
 8 
 9     mov cx, 80
10   s:mov [bx], 0403h
11     add bx, 2
12     loop s
13 
14     mov ah, 4ch
15     int 21h
16 code ends
17 end start
  • 运行结果:

 

 3.实验任务3

  • 汇编源代码:
 1 assume cs:code
 2 data1 segment
 3     db 50, 48, 50, 50, 0, 48, 49, 0, 48, 49 ; ten numbers
 4 data1 ends
 5 
 6 data2 segment
 7     db 0, 0, 0, 0, 47, 0, 0, 47, 0, 0       ; ten numbers
 8 data2 ends
 9 
10 data3 segment
11     db 16 dup(0)
12 data3 ends
13 
14 code segment
15 start:
16     mov ax, data1
17     mov ss, ax
18     mov ax, data2
19     mov es, ax
20     mov ax, data3
21     mov ds, ax
22     mov bx, 0
23 
24     mov cx, 10
25   s:mov al, ss:[bx]
26     add al, es:[bx]
27     mov [bx], al
28     add bx, 1
29     loop s
30 
31     mov ah, 4ch
32     int 21h
33 code ends
34 end start
  • 调试至循环开始之前,用d命令查看逻辑段data1,data2的内容:

  •  调试至循环结束,查看目标逻辑段的内容:

 容易发现,程序功能完成。数据代表的日期的分隔符号“.”被替换成了“/”。

 

4.实验任务4

  • task4.asm
 1 assume cs:code, ss:data1, ds:data2
 2 
 3 data1 segment
 4     dw 2, 0, 4, 9, 2, 0, 1, 9
 5 data1 ends 
 6 
 7 data2 segment
 8     dw 8 dup(?)
 9 data2 ends
10 
11 code segment
12 start:
13     mov ax, data1
14     mov ds, ax
15     mov ax, data2
16     mov ss, ax
17     mov sp, 10h
18     mov bx, 0
19 
20     mov cx, 8
21   s:push [bx]
22     add bx, 2
23     loop s
24 
25     mov ah, 4ch
26     int 21h
27 code ends
28 end start
  • 调试到循环结束后的截图:

 用d命令查看循环执行前后的内存空间,发现data1的内容确实被逆序复制到了data2处。

 

5.实验任务5

  • task5.asm
 1 assume cs:code, ds:data
 2 data segment
 3         db 'Nuist'
 4         db 2, 3, 4, 5, 6
 5 data ends
 6 
 7 code segment
 8 start:
 9         mov ax, data
10         mov ds, ax
11 
12         mov ax, 0b800H
13         mov es, ax
14 
15         mov cx, 5
16         mov si, 0
17         mov di, 0f00h
18 s:      mov al, [si]
19         and al, 0dfh
20         mov es:[di], al
21         mov al, [5+si]
22         mov es:[di+1], al
23         inc si
24         add di, 2
25         loop s
26 
27         mov ah, 4ch
28         int 21h
29 code ends
30 end start
  • 运行结果截图:

  •  调试至程序返回前截图:

  •  源代码中line19将存储单元内的数据和二进制数11011111逐位相与,即将小写字母转换为大写字母。
  • 源代码中data段line4的字节数据的用途是设置字符颜色。

 

6.实验任务6

  • task6.asm源代码
 1 assume cs:code, ds:data
 2 
 3 data segment
 4     db 'Pink Floyd      '
 5     db 'JOAN Baez       '
 6     db 'NEIL Young      '
 7     db 'Joan Lennon     '
 8 data ends
 9 
10 code segment
11 start:
12    mov ax, data
13    mov ds, ax
14    mov bx, 0
15 
16    mov cx, 4
17  s:mov ax, cx
18    mov cx, 4
19 
20  t:or byte ptr [bx], 20h
21    inc bx
22    loop t
23 
24    add bx, 12
25    mov cx, ax
26    loop s
27 
28    mov ah, 4ch
29    int 21h
30 code ends
31 end start
  • 调试到程序退出前,使用d命令查看数据段data对应的内存空间的截图:

 对比可见程序将每行第一个单词从大写->小写。

 

7.实验任务7

  •  task7.asm源码
 1 assume cs:code, ds:data, es:table
 2 
 3 data segment
 4     db '1975', '1976', '1977', '1978', '1979' 
 5     dw  16, 22, 382, 1356, 2390
 6     dw  3, 7, 9, 13, 28 
 7 data ends
 8 
 9 table segment
10     db 5 dup( 16 dup(' ') )  ;
11 table ends
12 
13 code segment
14 start:
15     mov ax, data
16     mov ds, ax
17     mov ax, table
18     mov es, ax
19     mov si, 0
20     mov di, 0
21     mov dx, 0
22     mov bx, 0
23 
24     mov cx, 5
25   s:mov ax, word ptr ds:[di]
26     mov word ptr es:[bx], ax
27     mov ax, word ptr ds:[di].2
28     mov word ptr es:[bx].2, ax
29 
30     mov ax, word ptr ds:[si].20
31     mov word ptr es:[bx].7, ax
32 
33     mov ax, word ptr ds:[si].30
34     mov word ptr es:[bx].10, ax
35 
36     mov ax, ds:[si].20
37     mov dl, ds:[si].30
38     div dl
39     mov byte ptr es:[bx].14, al
40     add di, 4
41     add si, 2
42     add bx, 16
43     loop s
44 
45     mov ah, 4ch
46     int 21h
47 code ends
48 end start
  • table段原始数据信息截图

  •  运行到程序退出之前,使用d命令查看table段对应的内存空间的截图

 信息确实结构化地写入了指定内存

posted @ 2021-11-05 00:03  T1lAM1lSU  阅读(103)  评论(0编辑  收藏  举报