汇编语言实验三
一、实验目的
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段中。
来源:https://www.cnblogs.com/jyxfeiyu/p/14043661.html |