汇编语言实验三
汇编语言实验三
一、实验目的
1. 理解和掌握将数据、代码、栈放入不同逻辑段的程序的编写和调试
2. 理解具有多个段的汇编源程序对应的目标程序执行时,内存分配方式
3. 掌握大小写字符的转换方法、数字字符和数值之间的转换方法
4. 理解并掌握各种寻址方式的灵活应用
5. 掌握汇编指令loop, and, or,div, mul的用法
二、实验准备
复习教材chapter 6-8章。
三、实验内容
1.实验任务1
task1.asm;
assume cs:code, ds:data data segment db 'Nuist' db 2,3,4,5,6 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
使用masm、link对task1.asm进行汇编、链接,得到可执行文件task1.exe,运行并观察结果。

使用g命令跳转到循环结束

修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果

可以看出这里的line4的数值作用是控制显示颜色的。
2.实验任务2
task2.asm;
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 di,0 mov cx,5 s: mov ah,0 mov al,ds:[di] mov bl,10 div bl mov ds:[10+di],al mov ds:[11+di],ah mov ah,2 mov dl,ds:[10+di] add dl,30h int 21h mov ah,2 mov dl,ds:[11+di] add dl,30h int 21h mov ah,2 mov dl," " int 21h inc di loop s mov ax,4c00h int 21h code ends end start
运行结果

3.实验任务3
task3.asm;
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
对task3.asm进行汇编、链接并执行程序

反汇编的结果

执行到程序退出前,查看data段数据


(1)data段数据为:0123H 0456H 0789H 0ABCH 0DEFH 0FEDH 0CBAH 0987H
(2)程序返回前,cs=076C、ss=076B、ds=076A
(3)设程序加载后,code段的段地址为x,则data段的段地址为x-2,stack段的段地址为x-1
4.实验任务4
task4.asm;
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
汇编、链接并执行程序

进行反汇编,并运行到程序返回前,用d命令查看data段中的数据

(1)data段中的数据为:0123H 0456H
(2)cs=076C、ss=076B、ds=076A
(3)设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1
(4)对于如下定义的段:
name segment
...
name ends
如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为16字节。
5.实验任务5
task5.asm;
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
汇编、链接并执行程序

反汇编,运行到程序返回前,用d命令查看data段中的数据

(1)data段中的数据为:0123H 0456H
(2)cpu执行程序,程序返回前,cs=076A,ss=076E,ds=076D
(3)设程序加载后,code段的段地址为X,则data段的段地址为X+3, stack段的段地址为X+4
6.实验任务6
如果将(1)、(2)、(3)题中最后一条伪指令"end start"改为"end"(也就是说不指名程序的入口),则那个程序仍然可以正确执行?请说明原因。
第(3)题的程序可以正确执行,因为如果不指定入口,则会按照顺序执行,第(1)、(2)题的数据段都放在了代码段的前面,数据段会被当成指令进行编译,可能出现错误,但第(3)题数据段位于代码段的后面不影响。
7.实验任务7
task7.asm
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 c segment db 0,0,0,0,0,0,0,0 c ends code segment start: mov ax,a mov ds,ax mov ax,c mov es,ax mov ax,0 mov bx,0 mov cx,8 s: mov al,ds:[bx] add ax,ax mov es:[bx],al inc bx loop s mov ax,4c00h int 21h code ends end start


编译完后使用d命令查看,可以看出a,b段相加给c段。
8.实验任务8
task8.asm
assume cs:code,ds:a,ss:b a segment dw 1,2,3,4,5,6,7,8,9,0ah,0ch,0dh,0eh,0fh,0ffh a ends b segment dw 0,0,0,0,0,0,0,0 b ends code segment start: mov ax,b mov ss,ax mov sp,10h mov ax,a mov ds,ax mov bx,0 mov cx,8 s: push [bx] add bx,2 loop s mov ax,4c00h int 21h code ends end start



成功将a段中的前8个字型数据,逆序存储到b段中。
浙公网安备 33010602011771号