汇编语言 王爽 第四版 实验5
Posted 霜序0.2℃
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编语言 王爽 第四版 实验5相关的知识,希望对你有一定的参考价值。
实验5 编写、调试具有多个段的程序
1
编译连接下面程序,用debug加载、跟踪,回答问题。
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
(1)CPU执行程序,程序返回前,data段中的数据为多少?
由栈的性质可得出,毫无变化
(2)CPU执行程序,程序返回前,cs=04b0h
,ss=04afh
,ds=0a4eh
.(不同的人结果不同)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RCht4eN4-1635949702387)(http://sehnsucht.top/img/image-20211103191422312.png)]
(3)程序加载后,code段地址设为X,则data段地址为X-2
,stack段的段地址为X-1
.
2
编译连接下面程序,用debug加载、跟踪,回答问题。
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
本题的重点在于:数据段和栈段在程序加载后实际占据的空间都是以16个字节为单位的。程序中只给出了前两个字数据,其余空间都用0填充。
(1)CPU执行程序,程序返回前,data段中的数据为多少?
根据栈的性质可知,不变
(2)CPU执行程序,程序返回前,cs=04b0h
,ss=04afh
,ds=04aeh
.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zUHzVoJ7-1635949702391)(http://sehnsucht.top/img/image-20211103192951164.png)]
(3)程序加载后,code段地址设为X,则data段地址为X-2
,stack段的段地址为X-1
.
(4)对于如下定义的段:
name segment
......
name ends
如果段中数据位N个字节,程序加载后,该段实际占据空间为(N+15)/16*16
因为如果<=16,那么按照一段,即16字节算,介于17和31之间算32字节
有兴趣的可以看看这里的讨论:https://bbs.csdn.net/topics/390585699
3
编译连接下面程序,用debug加载、跟踪,回答问题。
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段中的数据为多少?
根据栈的性质可知,数据不变
(2)CPU执行程序,程序返回前,cs=04ae
,ss=04b2
,ds=04b1
.
(3)程序加载后,code段地址设为X,则data段地址为X+3
,stack段的段地址为X+4
.
4
如果将end start
替换成end
,程序虽然还能运行,但是却不从start开始了,反而从整个程序文件第一个段开始执行,如果该段用来存放数据,则会将存放的数据翻译成汇编指令执行
5
编写code段中的代码,将a段和b段数据依次相加,结果存入c段
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,4c00h
int 21h
code ends
end start
填充
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;ds = a
mov ax,b
mov es,ax
mov bx,0
mov cx,8
s: mov al,es:[bx]
add ds:[bx],al
inc bx
loop s
mov ax,c
mov es,ax;es = c
mov bx,0
mov cx,8
s1: mov ax,ds:[bx]
mov es:[bx],ax
add bx,2
loop s1
mov ax,4c00h
int 21h
code ends
end start
a:04ae
b:04af
c:04b0
我看到有直接用ss:[bx]
来用的写法,试过了也可以,就不用像我这里两个循环了,中间汇编报错是真的难受,也没有显示哪里错了
6
编写code段中代码,用push指令将a段中前8个字型数据逆序存储到b段中。
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 0,0,0,0,0,0,0,0
b ends
code segment
start:
;?
mov ax,4c00h
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 0,0,0,0,0,0,0,0
b ends
code segment
start: mov ax,b
mov ss,ax
mov ax,10h ;栈空的情况
mov sp,ax ;栈放在b处
mov ax,a
mov es,ax
mov bx,0
mov cx,8
s: push es:[bx]
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
a:04ae
b:04b0
我们看a段,程序段a定义了从04ae:0
到04ae:1f
的16个字
b段正常将a段逆序翻转
以上是关于汇编语言 王爽 第四版 实验5的主要内容,如果未能解决你的问题,请参考以下文章