任务一
1.1
1 assume ds:data, cs:code, ss:stack 2 data segment 3 db 16 dup(0) ; 预留16个字节单元,初始值均为0 4 data ends 5 stack segment 6 db 16 dup(0) ;预留16个字节单元,初始值均为0 7 stack ends 8 code segment 9 start: 10 mov ax, data 11 mov ds, ax 12 mov ax, stack 13 mov ss, ax 14 mov sp, 16 ; 设置栈顶 15 mov ah, 4ch 16 int 21h 17 code ends 18 end start
① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A___, 寄存器(SS) = __076B__, 寄存器(CS) = 076C____ ② 假设程序加载后,code段的段地址是X,则,data段的段地址是X-2____, stack的段地址是__X-1__。
1.2
1 assume ds:data, cs:code, ss:stack
2 data segment
3 db 4 dup(0) ; 预留4个字节单元,初始值均为0
4 data ends
5 stack segment
6 db 8 dup(0) ;预留8个字节单元,初始值均为0
7 stack ends
8 code segment
9 start:
10 mov ax, data
11 mov ds, ax
12 mov ax, stack
13 mov ss, ax
14 mov sp, 8 ; 设置栈顶
15 mov ah, 4ch
16 int 21h
17 code ends
18 end start
① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A___, 寄存器(SS) = __076B__, 寄存器(CS) = 076C____ ② 假设程序加载后,code段的段地址是X,则,data段的段地址是X-2____, stack的段地址是__X-1__。
1.3
1 assume ds:data, cs:code, ss:stack
2 data segment
3 db 20 dup(0) ; 预留20个字节单元,初始值均为0
4 data ends
5 stack segment
6 db 20 dup(0) ;预留20字节单元,初始值均为0
7 stack ends
8 code segment
9 start:
10 mov ax, data
11 mov ds, ax
12 mov ax, stack
13 mov ss, ax
14 mov sp, 20; 设置栈顶
15 mov ah, 4ch
16 int 21h
17 code ends
18 end start
① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A___, 寄存器(SS) = __076C_, 寄存器(CS) = 076E____ ② 假设程序加载后,code段的段地址是X,则,data段的段地址是X-4____, stack的段地址是__X-2__。
1.4
1 assume ds:data, cs:code, ss:stack 2 code segment 3 start: 4 mov ax, data 5 mov ds, ax 6 mov ax, stack 7 mov ss, ax 8 mov sp, 20 9 mov ah, 4ch 10 int 21h 11 code ends 12 data segment 13 db 20 dup(0) 14 data ends 15 stack segment 16 db 20 dup(0) 17 stack ends 18 end start
① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076C___, 寄存器(SS) = __076E_, 寄存器(CS) = 076A____ ② 假设程序加载后,code段的段地址是X,则,data段的段地址是X+2____, stack的段地址是__X+4_。
实验任务2
1 assume cs:code 2 code segment 3 mov ax,0b800H 4 mov ds,ax 5 mov ax,80 6 mov cx,ax 7 mov bx,0f00H 8 s: mov byte ptr ds:[bx],3H 9 inc bx 10 mov byte ptr ds:[bx],4H 11 inc bx 12 loop s 13 14 mov ax,4c00h 15 int 21h 16 code ends 17 end
两种方法实验结果相同,均无法修改,推测修改位置为只读存储器。
1.5
① 对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是 _N/16 向上取整___。
② 如果将程序task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm中,伪指令 end start 改成 end , 哪一个程序仍然可以正确执行?结合实践观察得到的结论,分析、说明原因。
task1_4可以,其余程序不知道程序入口,task1_4在头部所以默认能够执行。
实验任务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 data2 segment 6 db 0, 0, 0, 0, 47, 0, 0, 47, 0, 0 ; ten numbers 7 data2 ends 8 data3 segment 9 db 16 dup(0) 10 data3 ends 11 code segment 12 start: 13 mov ax,data1 14 mov ds,ax 15 mov bx,0 16 mov cx,10 17 18 s: 19 mov ax,[bx] 20 mov ax,[bx+16] 21 mov [bx+32],ax 22 inc bx 23 loop s 24 25 mov ah, 4ch 26 int 21h 27 code ends 28 end start
任务4
1 assume cs:code 2 data1 segment 3 dw 2, 0, 4, 9, 2, 0, 1, 9 4 data1 ends 5 data2 segment 6 dw 8 dup(0) 7 data2 ends 8 code segment 9 start: 10 11 mov cx,8 12 mov ax,data1 13 mov dx,ax 14 mov bx,0 15 s: 16 mov ax,[bx] 17 push ax 18 inc bx 19 inc bx 20 loop s 21 mov cx,8 22 s1: 23 pop [bx] 24 inc bx 25 inc bx 26 loop s 27 mov ah, 4ch 28 int 21h 29 code ends 30 end start
任务5
1 assume cs:code, ds:data 2 data segment 3 db 'Nuist' 4 db 2, 3, 4, 5, 6 5 data ends 6 code segment 7 start: 8 mov ax, data 9 mov ds, ax 10 mov ax, 0b800H 11 mov es, ax 12 mov cx, 5 13 mov si, 0 14 mov di, 0f00h 15 s: mov al, [si] 16 and al, 0dfh 17 mov es:[di], al 18 mov al, [5+si] 19 mov es:[di+1], al 20 inc si 21 add di, 2 22 loop s 23 mov ah, 4ch 24 int 21h 25 code ends 26 end start
line 19 :大小写转换
更改后颜色发生变化,推测为更改颜色
任务六
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 cx,4 15 mov bx,0 16 s: mov al,[bx] 17 or al,20H 18 mov [bx],al 19 add bx,16 20 loop s 21 mov ah, 4ch 22 int 21h 23 code ends 24 end start
任务7
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 20 mov bx, 0 21 mov bp, 0 22 mov cx, 5 23 years: 24 mov ax, ds:[bx] 25 mov es:[bp], ax 26 mov ax, ds:[bx+2] 27 mov es:[bp+2], ax 28 add bx, 4 29 add bp, 10h 30 loop years 31 32 mov bp, 5 33 mov cx, 5 34 income: 35 mov ax, ds:[bx] 36 mov es:[bp], ax 37 add bx, 2 38 add bp, 10h 39 loop income 40 41 mov cx, 5 42 mov bp, 10 43 people: 44 mov ax, ds:[bx] 45 mov es:[bp], ax 46 add bx, 2 47 add bp, 10h 48 loop people 49 50 mov cx, 5 51 mov bp, 5 52 average: 53 mov ax, es:[bp] 54 mov bl, es:[bp+5] 55 div bl 56 mov es:[bp+8], al 57 add bp,10h 58 loop average 59 60 mov ah, 4ch 61 int 21h 62 code ends 63 end start