实验2 多个逻辑段的汇编源程序编写与调试
实验任务1
- 任务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 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

问题回答
① 在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 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

问题回答
① 在debug中将执行到line9结束、line11之前,记录此时:寄存器(DS) = __076C__, 寄存器(SS) = __076E__, 寄存器(CS) = __076A__
② 假设程序加载后,code段的段地址是X,则,data段的段地址是__X+2__, stack的段地址 是_X+4___。
- 任务1-5
基于上述四个实验任务的实践、观察,总结并回答:
① 对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是 __[ N / 16 ] * 16__。
② 如果将程序task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm中,伪指令 end start 改成 end , 哪一个程序仍然可以正确执行。结合实践观察得到的结论,分析、说明原因。
task1_4.asm可以执行。将end start替换成end意味着程序未指定开始位置,整个代码段都被当做执行代码来执行,而执行数据段中的数据自然会出错,只有task1_4.asm的开始是执行代码。
实验任务2
编写一个汇编源程序,实现向内存单元b800:0f00 ~ b800:0f9f连续160字节,依次重复填充十六进制数 据03 04。
Tips:
1. 在实验1的实验任务3中,做过达到同样效果的实验。但当时是通过debug的f命令实现填充的。这一 次,要求编程实现。 在debug中,使用f命令,向内存单元批量填写数据。 -f b800:0f00 0f9f 03 04 把内存单元区间b800:0f00 ~ b800:0f9f连续160个字节,依次重复填充十六进制数据03 04。
2. 编程实现时,注意进制问题、字节顺序问题。编写后,运行程序,如果与实验1的实验任务3结果不一 致,说明程序编写有错误。
1 code segment 2 start: 3 mov ax,0b800h 4 mov ds,ax 5 mov bx,0f00h 6 mov cx,50h 7 mov ax,0403h 8 a:mov ds:[bx],ax 9 add bx,2 10 loop a 11 12 mov ah,4ch 13 int 21h 14 code ends 15 end start

实验任务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 17 mov ax, data1 18 mov ds, ax 19 mov bx, 0 20 mov cx, 0ah ; 循环10次,对应16进制数0ah 21 s: mov ax, ds:[bx] 22 add ax, ds:[bx+10h] ; 将data2中对应数据加到ax 地址相差16字节,即10h 23 mov ds:[bx+20h], ax ; 把ax数据存入data3对应位置 地址相差32字节,即20h 24 inc bx 25 loop s 26 27 inc bx 28 loop s 29 30 mov ax,4c00h 31 int 21h 32 33 code ends 34 end start



实验任务4
1 assume cs:code 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 stack segment 12 dw 8 dup(0) 13 stack ends 14 15 16 code segment 17 start : 18 mov ax,data1 19 mov ds,ax 20 mov sp,9 21 mov bx,0 22 mov cx,8 23 s1:push ds:[bx] 24 add bx,2 25 loop s1 26 27 28 mov ax,data2 29 mov ds,ax 30 mov bx,0 31 mov cx,8 32 s2:pop ds:[bx] 33 add bx,2 34 loop s2 35 36 mov ah,4ch 37 int 21h 38 39 code ends 40 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, 2g 27g 22 loop s 23 mov ah, 4ch 24 int 21h 25 code ends 26 end start


源代码中line19的作用是?
将小写字母转换为大写字母。
源代码中data段line4的字节数据的用途是?
指定字母的颜色
实验任务6
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 15 mov ax, data 16 mov es, ax 17 18 mov bx, 0 19 mov cx, 4 ; 外层4个表达式,循环4次 20 21 s0: mov si, cx 22 mov cx, 4 ; 内层转换第一个单词(4字符),循环4次 23 24 s1: mov al, es:[bx] 25 or al, 20h ; 大写->小写 or 00100000B 即or 20h 26 mov es:[bx], al; 27 inc bx 28 loop s1 29 30 mov cx, si 31 mov bx, 0 32 mov ax, es 33 inc ax 34 mov es, ax 35 loop s0 36 37 mov ah, 4ch 38 int 21h 39 code ends 40 end start

实验任务7
1 assume cs:code, ds:data, es:table 2 3 data segment 4 db '1975', '1976', '1977', '1978', '1979' ; 起始地址0 每次偏移量4 5 dw 16, 22, 382, 1356, 2390 ; 起始地址20 每次偏移量2 6 dw 3, 7, 9, 13, 28 ; 起始地址30 每次偏移量2 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 cx, 5 21 mov bx, 0 22 mov si, 0 23 mov di, 0 24 s: 25 mov ax, [bx+2] 26 mov es:[di+2], ax 27 mov ax, [bx] 28 mov es:[di], ax 29 mov ax, [si+20] 30 mov word ptr es:[di+5], 0 31 mov word ptr es:[di+7], ax 32 mov ax, [si+30] 33 mov word ptr es:[di+11], ax 34 mov word ptr es:[di+9], 0 35 mov ax, es:[di+7] 36 div byte ptr es:[di+11] 37 mov byte ptr es:[di+13], 0 38 mov es:[di+14], al 39 add bx, 4 40 add si, 2 41 add di, 16 42 loop s 43 44 mov ah, 4ch 45 int 21h 46 code ends 47 end start



浙公网安备 33010602011771号