实验2 多个逻辑段的汇编源程序编写与调试
实验任务1
任务1-1
task1_1.asm代码如下:
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
1)在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _0770___, 寄存器(SS) =_0771___, 寄存器(CS) = _0772___
2)假设程序加载后,code段的段地址是X,则,data段的段地址是__X-2__, stack的段地址是__X-1__。
实验结果截图如下:
任务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 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
1)在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _0770___, 寄存器(SS) =__0771__, 寄存器(CS) = _0772___
2)假设程序加载后,code段的段地址是X,则,data段的段地址是_X-2___, stack的段地址是__X-1__。
实验结果如图:
任务1-3
task1_3.asm代码:
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
1)在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _0770___, 寄存器(SS) =___0772_, 寄存器(CS) = _0774___
2)假设程序加载后,code段的段地址是X,则,data段的段地址是_X-4___, stack的段地址是_X-2___。
实验结果如下:
任务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 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
1)在debug中将执行到line9结束、line11之前,记录此时:寄存器(DS) = __0772__, 寄存器(SS) =__0774__, 寄存器(CS) = __0770__
2)假设程序加载后,code段的段地址是X,则,data段的段地址是_X+2___, stack的段地址是_X+4___。
任务1-5
1)对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是 _2*[N/16] B_([]为向上取整)___。
2)如果将程序task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm中,伪指令 end start 改成
end , 哪一个程序仍然可以正确执行?结合实践观察得到的结论,分析、说明原因。
程序task1_4.asm可以正确执行,因为end start指明了程序从start开始执行,不指定默认CS为DS+10H,只有task1_4.asm的程序段在最上面,可以正确执行,其余会出错
试验任务2
代码 :
1 assume cs:code 2 3 code segment 4 start: 5 mov ax, 0b800h 6 mov ds, ax 7 mov bx, 0f00h 8 mov cx, 50h 9 10 s: mov ds:[bx], 0403h 11 add bx, 2 12 loop s 13 14 mov ah, 4ch 15 int 21h 16 code ends 17 end start
实验结果截图:
实验任务3
task3.asm 补充完整代码:
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,0ah s: mov ax,[bx] add ax,10h[bx] mov 20h[bx],ax inc bx loop s mov ah,4ch int 21h code ends end start
1)在debug中加载、反汇编:
2)在debug中加载、反汇编、调试。在数据项依次相加前,和相加后,分别查看三个逻辑段data1,
data2, data3对应的内存空间,确认逐一相加后,结果的确保存在了逻辑段data3中。
相加前:
相加后:
实验任务4
补全后的代码:
1 assume cs:code,ss:stack 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(?) 13 stack ends 14 15 code segment 16 start: 17 mov ax,stack 18 mov ss,ax 19 mov sp,8 20 21 mov ax,data1 22 mov ds,ax 23 mov bx,0 24 mov cx,8 25 s: 26 push [bx] 27 add bx,2 28 loop s 29 30 mov ax,data2 31 mov ds,ax 32 mov bx,0 33 mov cx,8 34 s2: 35 pop [bx] 36 add bx,2 37 loop s2 38 39 mov ah, 4ch 40 int 21h 41 code ends 42 end start
在debug中加载、反汇编:
在程序退出前,使用d命令查看数据段data2对应的内存空间的截图。
实验任务5
task5.asm代码:
1 assume cs:code, ds:data 2 data segment 3 db 'Nuist' 4 ;db 2, 3, 4, 5, 6 5 db 5 dup(2) 6 data ends 7 8 code segment 9 start: 10 mov ax, data 11 mov ds, ax 12 13 mov ax, 0b800H 14 mov es, ax 15 16 mov cx, 5 17 mov si, 0 18 mov di, 0f00h 19 s: mov al, [si] 20 and al, 0dfh 21 mov es:[di], al 22 mov al, [5+si] 23 mov es:[di+1], al 24 inc si 25 add di, 2 26 loop s 27 28 mov ah, 4ch 29 int 21h 30 code ends 31 end start
1)对程序进行汇编、链接,得到可执行文件,运行并观察结果。
2)
3)line19的作用:将小写字母ASCII码转换成对应的大写字母ASCII码。
4)
5)作用:存放代表颜色的数值。
试验任务6
代码补全后:
1 assume cs:code, ds:data, ss:stack 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 stack segment 11 dw 1 dup(?) 12 stack ends 13 14 code segment 15 start: 16 mov ax,stack 17 mov ss,ax 18 mov sp,1 19 20 mov ax,data 21 mov ds,ax 22 23 mov ax,data 24 mov es,ax 25 mov cx,4 26 s: 27 push cx 28 mov bx,0 29 mov cx,4 30 31 s2: 32 mov al,es:[bx] 33 or al,20h 34 mov es:[bx],al 35 inc bx 36 loop s2 37 38 pop cx 39 mov ax,es 40 inc ax 41 mov es,ax 42 43 loop s 44 45 mov ah, 4ch 46 int 21h 47 code ends 48 end start
1)在debug中加载、反汇编、调试截图。
2)程序退出前:
实验任务7
代码补全:
1 assume cs:code, ds:data, es:table,ss:stack 2 3 data segment 4 db '1975', '1976', '1977', '1978', '1979' 5 dd 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 stack segment 14 dw 1 dup(?) 15 stack ends 16 17 code segment 18 start: 19 mov ax,stack 20 mov ss,ax 21 mov sp,1 22 mov ax,data 23 mov ds,ax 24 mov ax,table 25 mov es,ax 26 27 mov di,0;data 28 29 ;1 30 mov bx,0;table 31 mov si,0;table 32 mov cx,5 33 year: 34 push cx 35 mov cx,4 36 37 year2: 38 mov al,ds:[di] 39 mov es:[bx+si],al 40 inc si 41 inc di 42 loop year2 43 44 pop cx 45 add bx,10h 46 mov si,0 47 loop year 48 49 ;2 50 mov bx,0 51 mov si,5 52 mov cx,5 53 income: 54 push cx 55 mov cx,4 56 57 income2: 58 mov al,ds:[di] 59 mov es:[bx+si],al 60 inc si 61 inc di 62 loop income2 63 64 pop cx 65 add bx,10h 66 mov si,5 67 loop income 68 69 ;3 70 mov bx,0 71 mov si,10 72 mov cx,5 73 num: 74 push cx 75 mov cx,2 76 77 num2: 78 mov al,ds:[di] 79 mov es:[bx+si],al 80 inc si 81 inc di 82 loop num2 83 84 pop cx 85 add bx,10h 86 mov si,10 87 loop num 88 89 ;4 90 mov bx,0 91 mov si,5 92 mov cx,5 93 cal: 94 mov ax,word ptr es:[bx+si] 95 add si,2 96 mov dx,word ptr es:[bx+si] 97 add si,3 98 div word ptr es:[bx+si] 99 add si,3 100 mov word ptr es:[bx+si],ax 101 102 add bx,10h 103 mov si,5 104 loop cal 105 106 mov ah, 4ch 107 int 21h 108 code ends 109 end start
1)查看table段原始数据信息截图
2)在debug中运行到程序退出之前,使用d命令查看table段对应的内存空间的截图,确认信息是否按要求结构化地写入到指定内存