学汇编,记笔记(实验笔记)《汇编语言》王爽著——实验5_编写调试具有多个段的程序

405 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

学习教材:《汇编语言(第4版)》王爽著 此笔记是书中内容+自我总结,方便查阅和复习 请支持原著

实验前别忘了复习笔记

(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)答案

  • 不变 先入后出,未改变data段数据。
  • 填写实际加载的地址,非标准答案
  • X-2X-1 由cs、ss、ds可得

(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

(2)答案

  • 前两个字数据不变,其余6个字补零u获取程序末尾地址,g 地址跳转到程序末尾在这里插入图片描述 最后d ds:0查看data段数据在这里插入图片描述

实际上只申请了4个字节的空间,但在汇编中,直接分配16字节,不足用00补全。

  • 填写实际运行的地址,非标准答案
  • X-2X-1
  • (N//16+1)*16个字节

N字节数据实际占用空间为(N//16+1)*16个字节,对于每一个段,会用0补齐到16个字节的正整数倍,//为向下取整除法

(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

(3)答案

  • 前两个字数据不变,其余6个字补零
  • 填写实际运行的地址,非标准答案
  • X+3X+4。 CX指明本程序机器码占用44H,68字节。由于加载会补全到16的正整数倍大小,因此总共三个段空间为16*5B,data、stack段各占16B,code段长度16*3B,因此+3与+4 在这里插入图片描述

(4)如果将(1)、(2)、(3)题中的最后一条伪指令 “end start"改为“end" (也就是说不指明程序的入口),则那个程序仍然可以正确执行?请说明原因。

(4)答案

都能运行,但只有(3)正常运行。其他程序都将data段当作代码运行。

(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:
	?
code ends

end start

(5)答案

c段命名冲突,改成cc段

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

cc segment
	db 0,0,0,0,0,0,0,0
cc ends

code segment
start:
	;需要三个段寄存器指向三个段
	;c段是普通段,不优先考虑使用栈段寄存器ss
	;可供选用的只有ds和es段寄存器
	mov ax,b 
	mov es,ax ;将es指向b段
	
	mov bx,0 ;作为地址递增
	mov cx,8 ;循环八次
	
s:
	mov ax,a
	mov ds,ax ;先将ds指向a段
	mov dl,[bx] ;获取一个a段的字节型数据
	add dl,es:[bx] ;与对位的b段字节型数据相加
	mov ax,cc 
	mov ds,ax ;ds指向cc段
	mov [bx],dl ;对位存储
	inc bx ;地址递增
	loop s ;循环
			
code ends

end start

u获取循环处地址用g跳转,p跳过循环,d ds:0查看cc段存储的数据

在这里插入图片描述 在这里插入图片描述 结果正确