实验3 多个段的汇编源程序编写与调试
一、实验一
1.ex1
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
mov cx, 5 定义步长为5,5次循环 mov si, 0 初始化 si 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 循环执行
2.使用masm、link对ex1.asm进行汇编、链接,得到可执行文件ex1.exe,运行并观察结果。
3.使用debug工具对程序进行调试,执行到程序返回前,即line27之前,观察结果。
4.修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果。
db 5 dup(2) --> 改成: db 2,3,4,5,6
基于观察,分析、猜测这里的数值作用是什么。
答:存放数据颜色信息
二、实验二
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 dh,0ah mov di,0 mov cx,5 s: mov al,[di] mov ah,00h div dh add al,30h add ah,30h mov bx,ax inc di mov ah,2 mov dl,bl int 21h mov dl,bh int 21h mov dl,20h int 21h loop s mov ah,4ch int 21h code ends end start
三、实验三
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
使用masm、link对ex3.asm进行汇编、链接
1.程序返回前,data 段中的数据是多少?
答:23 01 56 04 89 07 bc 0a ef 0d ed 0f ba 0c 87 09
2.程序返回前,cs=076C,ss=076B,ds=076A
3. 设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1、、
四、实验四
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
1.CPU执行程序,程序返回前,data段中的数据为多少?
答:23 01 56 04
2.CPU执行程序,程序返回前,cs=076C,ss=076B,ds=076A
3.设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1
4. 对于定义如下的段:
name segment
…
name ends
如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为:⌈16N⌉×16
五、实验五
assume cs:code, ds:data, ss:stack 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 data segment dw 0123h, 0456h data ends stack segment dw 0,0 stack ends end start
1.CPU执行程序,程序返回前,data段中的数据为多少?
答:23 01 56 04
2.CPU执行程序,程序返回前,cs=076A,ss=076E,ds=076D
3. 设程序加载后,code段的段地址为X,则data段的段地址为X+3,stack段的段地址为X+4
六、实验六
如果将“end start ”改为“end”(也就是说不指明程序入口),则哪些程序仍可以被正确执行?
答:不指明程序入口,那么程序会直接从最开始运行,所以只有ex5可以正常运行
七、实验七
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 si,0 mov cx,8 s: mov ax,[si] add ax,[16+si] mov [32+si],ax inc si loop s mov ah, 4ch int 21h code ends end start
八、实验八
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 s: push ds:[bx] add bx,2 loop s mov ah, 4ch int 21h code ends end start