实验3 多个段的汇编源程序编写与调试
1. 实验任务1
assume cs:code, ds:data data segment db 'Nuist' db 5 dup(2) data ends code segment start: mov ax, data mov ds, ax mov ax, 0b800H mov es, ax mov cx, 5 mov si, 0 mov di, 0f00h s: mov al, [si] and al, 0dfh mov es:[di], al mov al, [5+si] mov es:[di+1], al inc si add di, 2 loop s mov ah, 4ch int 21h code ends end start



字节数据用途:控制颜色
2. 实验任务2
编写程序,在屏幕上以十进制整数形式打印输出这5个两位数
assume cs:code, ds:data data segment db 23, 50, 66, 71, 35 data ends code segment start: mov ax, data mov ds, ax mov si,0 mov cx,5 s:mov ax,0 mov al,ds:[si] mov bl,10 div bl add al,48 ;将数字转化为字符 add ah,48 mov bh,ah mov ah,2 mov dl,al ;输出字符 int 21h mov dl,bh int 21h inc si loop s mov ah,4ch int 21h code ends end start

3. 实验任务3
assume cs:code, ds:data, ss:stack data segment dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h data ends stack segment dw 0, 0, 0, 0, 0, 0, 0, 0 stack ends code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start

程序返回前,data段中的数据:

程序返回前,CS=076C,SS=0769,DS=075A

程序加载后,设code段段地址为X,则data段段地址为X-2,stack段段地址为X-1

4. 实验任务4
assume cs:code, ds:data, ss:stack data segment dw 0123h, 0456h data ends stack segment dw 0, 0 stack ends code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start
程序返回前,data段中数据如下:

程序返回前,CS=076C,SS=0769,DS=075A

程序加载后,设code段段地址为X,则data段段地址为X-2,stack段段地址为X-1
对于如下定义的段:
name segment
···
name ends
如果段中数据占N个字节,则程序加载后,该段实际占有的空间为(N/16)*16
5. 实验任务5
程序返回前,data段中数据如下:

程序返回前,CS=076A,SS=0769,DS=075A

程序加载后,设code段段地址为X,则data段段地址为X+3,stack段段地址为X+4
6.实验任务6
如果将(1)(2)(3)题中的最后一条伪指令“end start”改为“end”,则(3)仍可以正确执行,(3)中一开始定义的就是代码段,
程序会从代码开始执行,而(1)(2)中一开始是数据段代码段,逻辑上是错误的执行。
7. 实验任务7
assume cs:code a segment db 1,2,3,4,5,6,7,8 a ends b segment db 1,2,3,4,5,6,7,8 b ends c1 segment db 8 dup(0) c1 ends code segment start: mov ax,a mov ds,ax mov bx,0 mov cx,8 s: mov ax,ds:[bx] add ax,ds:[bx+16] mov ds:[bx+32],ax inc bx loop s mov ah,4ch int 21h code ends end start

8. 实验任务8
assume cs:code a segment dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh a ends b segment dw 8 dup(0) b ends code segment start: mov ax,a mov ds,ax mov ax,b mov ss,ax mov sp,16 mov bx,0 mov cx,8 s:push ds:[bx] add bx,2 loop s mov ax,4ch int 21h code ends end start

实验结论:
使用u指令反汇编时要从CX中减去数据段和栈段的空间;
不同段的空间分开计算,不足16按16计算

浙公网安备 33010602011771号