汇编语言实验二

实验任务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执行之前)的截图

line19的作用是通过按位与的方式,把小写字母转换为大写。

更改line4为db 5 dup(2)

line4中的5个字节的作用是设置五种不同的颜色。

实验任务6

代码:
assume cs:code, ds:data

data segment
	db 'Pink Floyd      '
	db 'JOAN Baez       '
	db 'NEIL Young      '
	db 'Joan Lennon     '
data ends

code segment
start:
   mov ax, data
   mov ds, ax

   mov cx, 64
   mov bx, 0
s: or  [bx], byte ptr 20h
   inc bx
   loop s

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

程序调试:

运行前后大小写:

实验任务7

代码:

assume cs:code, ds:data, es:table

data segment
	db '1975', '1976', '1977', '1978', '1979' 
	dw  16, 22, 382, 1356, 2390
	dw  3, 7, 9, 13, 28 
data ends

table segment
	db 5 dup( 16 dup(' ') )  ;
table ends

code segment
start:
	mov ax, data
	mov ds, ax
	mov ax, table
	mov es, ax

	mov cx, 5
	mov bx, 0
	mov si, 0
s1: mov ax, [si]
	mov es:[bx], ax
	mov ax, [si+2]
	mov es:[bx+2], ax
	add bx, 16
	add si, 4
	loop s1

	mov cx, 5
	mov bx, 5
	mov si, 20
s2: mov ax, [si]
	mov es:[bx], ax
	mov ax, 0000h
	mov es:[bx+2], ax
	add bx, 16
	add si, 2
	loop s2

	mov cx, 5
	mov bx, 10
	mov si, 30
s3: mov ax, [si]
	mov es:[bx], ax
	add bx, 16
	add si, 2
	loop s3

	mov cx, 5
	mov si, 5
s4: mov ax, es:[si]
	mov bl, es:[si+5]
	div bl
	mov es:[si+8], al
	add si, 16
	loop s4

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

table段原始数据:

运行结果:

实验总结

  1. 本次实验和实验一包含紧密,也结合了上课讲的重点内容比如div在16位除以除8位和32位除以16位时的细节使用方法等等。
  2. 实验难度由浅入深,前几道实验大大提高了我的汇编动手能力,自己组织代码很有收获,最后一道题目综合性强,但是运用循环也可以快速解决。
  3. 实验5和6复习了上课讲的与或运算符,和使用转换大小写。
posted @ 2021-11-03 15:09  fyhtom  阅读(99)  评论(1编辑  收藏  举报