天天看点

汇编语言实验二

实验任务1

任务1-1

task1_1调试到line17结束、line19之前截图

汇编语言实验二

问题回答

① 在debug中将执行到line17结束、line19之前,记录此时:

寄存器(DS) = 076A

寄存器(SS) = 076B

寄存器(CS) = 076C

② 假设程序加载后,code段的段地址是X,则,

data段的段地址是__X-2__

stack的段地址是__X-1__

任务1-2

task1_2调试到line17结束、line19之前截图

汇编语言实验二

问题回答

① 在debug中将执行到line17结束、line19之前,记录此时:

寄存器(DS) = 076A

寄存器(SS) = 076B

寄存器(CS) = 076C

② 假设程序加载后,code段的段地址是X,则,

data段的段地址是__X-2__

stack的段地址是__X-1__

任务1-3

task1_3调试到line17结束、line19之前截图

汇编语言实验二

问题回答

① 在debug中将执行到line17结束、line19之前,记录此时:

寄存器(DS) = 076A

寄存器(SS) = 076C

寄存器(CS) = 076E

② 假设程序加载后,code段的段地址是X,则,

data段的段地址是__X-4__

stack的段地址是__X-2__

任务1-4

task1_4调试到line17结束、line19之前截图

汇编语言实验二

问题回答

① 在debug中将执行到line17结束、line19之前,记录此时:

寄存器(DS) = 076C

寄存器(SS) = 076E

寄存器(CS) = 076A

② 假设程序加载后,code段的段地址是X,则,

data段的段地址是__X+2__

stack的段地址是__X+4__

任务1-5

① 对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是__N/16向上取整__

xxx segment
    db N dup(0)
xxx ends
           

② 如果将程序task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm中,伪指令end start 改成

end , 哪一个程序仍然可以正确执行?结合实践观察得到的结论,分析、说明原因。

答:只有task1_4可以正确执行,实验发现task1_1-1_3的cs中都没有程序的代码了。

原因:没有了伪指令,exe文件被加载在内存中,首先将CS:IP指向程序的首地址。而只task1_4的程序中一开始定义的是代码段,所以CS:IP指向了指令的首地址。task1_1-1_3的程序中一开始定义的是数据段,所以cs:ip指向了数据的首地址而非指令,而CPU会把数据段中的数据当中机器指令来执行。

实验任务2

代码:

assume cs:code
code segment
start:
	mov ax, 0b800h
	mov ds, ax
	mov bx, 0f00h
	mov cx, 80
s:  mov [bx], 0403h
	add bx, 2
	loop s
	mov ah, 4ch
	int 21h
code ends
end
           

运行结果:

汇编语言实验二

实验任务3

代码:

assume cs:code
data1 segment
	db 50, 48, 50, 50, 0, 48, 49, 0, 48, 49 ; ten numbers
data1 ends

data2 segment
	db 0, 0, 0, 0, 47, 0, 0, 47, 0, 0       ; ten numbers
data2 ends

data3 segment
	db 16 dup(0)
data3 ends

code segment
start:
	mov bx, 0
	mov cx, 10

s:  mov dx, 0
	mov ax, data1
	mov ds, ax
	add dl, [bx]

	mov ax, data2
	mov ds, ax
	add dl, [bx]

	mov ax, data3
	mov ds, ax
	add [bx], dl

	inc bx
	loop s

	mov ah, 4ch
	int 21h
code ends
end start
           

运行结果:

相加之前和之后的截图:

汇编语言实验二

实验任务4

代码:

assume cs:code
data1 segment
	dw 2, 0, 4, 9, 2, 0, 1, 9
data1 ends

data2 segment
	dw 8 dup(?)
data2 ends

code segment
start:
	mov ax, data1
	mov ds, ax
	mov ax, data2
	mov es, ax
	mov ss, ax
	mov sp, 30

	mov bx, 0
	mov cx, 8
s1: push ds:[bx]
	add bx, 2
	loop s1

	mov bx, 0
	mov cx, 8
s2: pop es:[bx]
	add bx, 2
	loop s2

	mov ah, 4ch
	int 21h
code ends
end start
           

调试和运行结果:

汇编语言实验二

程序运行之前data1和data2数据,以及运行后data2中的数据

汇编语言实验二

实验任务5

源码运行结果截图:

汇编语言实验二

使用debug工具对程序进行调试,使用g命令一次性执行到程序返回前(即ine25执行之后、line27执行之前)的截图

汇编语言实验二

实验任务6

实验任务7