汇编语言 王爽 第四版 实验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.

image-20211103202627245

(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

image-20211103215557033

我看到有直接用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

image-20211103222446977

b:04b0

image-20211103222327347

我们看a段,程序段a定义了从04ae:004ae:1f的16个字

b段正常将a段逆序翻转

Guess you like

Origin blog.csdn.net/Dueser/article/details/121132316