实验2 多个逻辑段的汇编源程序编写与调试
1、实验任务1
任务1-1
① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A_, 寄存器(SS) = _076B_, 寄存器(CS) = _076C_
② 假设程序加载后,code段的段地址是X,则,data段的段地址是_X-2h_, stack的段地址是_X-1h_。
任务1-2
① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A_, 寄存器(SS) = _076B_, 寄存器(CS) = _076C_
② 假设程序加载后,code段的段地址是X,则,data段的段地址是_X-2h_, stack的段地址是_X-1h_。
任务1-3
① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A_, 寄存器(SS) = _076C_, 寄存器(CS) = _076E_
② 假设程序加载后,code段的段地址是X,则,data段的段地址是_X-4h_, stack的段地址是_X-2h_。
任务1-4
① 在debug中将执行到line9结束、line11之前,记录此时:寄存器(DS) = _076C_, 寄存器(SS) = _076E_, 寄存器(CS) = _076A_
② 假设程序加载后,code段的段地址是X,则,data段的段地址是_X+2h_, stack的段地址是 _X+4h_。
任务1-5
基于上述四个实验任务的实践、观察,总结并回答:
① 对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是 __2*[N/16] B_([]为向上取整)__。
② 如果将程序task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm中,伪指令 end start 改成 end , 哪一个程序仍然可以正确执行?结合实践观察得到的结论,分析、说明原因。
答:task1_4.asm仍然可以正常运行,由任务1-1可知DS和CS之间的地址默认相差10h,如果没有指出程序的开始位置,程序默认从DS+10h开始运行,将end start改成end,使用-r查看寄存器,可以看到CS的值为076A,而非task1_1.exe中的076C,使用反汇编进行查看,可以发现CS开始的区域全部为0,没有可供执行的指令,其他同理。
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 mov cx,50h;50h即80 9 mov ax,0403h 10 s: mov ds:[bx],ax 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 ds,ax 18 mov bx,0 19 mov cx,0ah 20 s:mov ax,ds:[bx] 21 add ax,ds:[bx+10h] 22 mov ds:[bx+20h],ax 23 inc bx 24 loop s 25 26 mov ah,4ch 27 int 21h 28 code ends 29 end start
反汇编:
相加前:
相加后:
4、实验任务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
加载:
反汇编:
运行结果:
5、实验任务5
源码:
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的作用是?
答: 将小写字母转换成大写字母。
将line 4修改为:db 5 dup(2),运行结果:
问题:源代码中data段line4的字节数据的用途是?
答:line4的作用是设置颜色。
6、实验任务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
加载:
反汇编:
运行结果:
7、实验任务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
运行结果:
结构化写入后: