汇编语言实验二
实验任务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段原始数据:
运行结果:
实验总结
- 本次实验和实验一包含紧密,也结合了上课讲的重点内容比如div在16位除以除8位和32位除以16位时的细节使用方法等等。
- 实验难度由浅入深,前几道实验大大提高了我的汇编动手能力,自己组织代码很有收获,最后一道题目综合性强,但是运用循环也可以快速解决。
- 实验5和6复习了上课讲的与或运算符,和使用转换大小写。