1.实验任务1
任务1-1:
对task1_1.asm进行汇编、连接:
用debug加载:
由于debug 执行到line 17结束,line19之前,先用u命令找到line 19对应命令的存储位置,再用g 命令直接进行到那条命令,如下:
由图可知:
①此时DS=076Ah,SS=076Bh,CS=076Ch。
②假设code段地址是X,则data段地址是X-2,stack段地址是X-1。
任务1-2:
基本操作步骤与任务1-1一致,得最后debug结果:
由图可知:
①此时DS=076Ah,SS=076Bh,CS=076Ch。
②假设code段地址是X,则data段地址是X-2,stack段地址是X-1。
任务1-3
基本操作步骤与任务1-1一致,得最后debug结果:
由图可知:
①此时DS=076Ah,SS=076Ch,CS=076Eh。
②假设code段地址是X,则data段地址是X-4,stack段地址是X-2。
任务1-4
基本操作步骤与任务1-1一致,得最后debug结果:
由图可知:
①此时DS=076Ch,SS=076Eh,CS=076Ah。
②假设code段地址是X,则data段地址是X+2,stack段地址是X+4。
任务1-5:
①分配给该段的内存空间大小是(N/16)的上取整。
② 伪指令 end start 改成 end后得:
task1_1截图:
task1_2截图:
task1_3截图:
task1_4截图:
由截图可知,只有task1_4.asm程序仍然可以正确执行。这是因为任务1_1到任务1_3都是先定义数据段再定义代码段,而任务1_4是先定义代码段再定义数据段的。end start告诉程序,代码是从start开始,写成end后程序就从第一行开始编译。因为任务1_4代码段写在前面,从第一行编译不受影响。
2.实验任务2
实验代码:
assume cs:code code segment mov ax, 0b800h mov ds, ax mov bx, 0f00h mov cx, 160 s: mov ax, 0403h mov [bx], ax add bx, 2h loop s mov ax,4c00h int 21h code ends end
实验结果截图:
3.实验任务3
实验代码:
code segment start: mov bx, 0 mov cx, 10 s: mov dx, 0 ;寄存器dx存数据 mov ax, data1 mov ds, ax add dl, [bx] mov ax, data2 mov ds, ax add dl, [bx] mov ax, data3 mov ds, ax mov [bx], dl inc bx loop s mov ax, 4c00h int 21h code ends end start
实验效果截图:
加载、反汇编、调试:
调试后执行到结尾:
逻辑段data1对应的内存空间:
逻辑段data2对应的内存空间:
逻辑段data3对应的内存空间:
由各个对应的内存空间显示可知,结果的确保存在了逻辑段data3中。
4.试验任务4
实验代码:
code segment start: mov ax, data2 mov ss, ax mov sp, 10h mov ax, data1 mov ds, ax mov dx, 0 mov cx, 8 s:push [bx] add bx, 2 loop s mov ah, 4ch int 21h code ends end start
实验效果截图:
经汇编、连接后debug加载程序得:
data1内存单元存储如下:
data2内存单元存储如下:
又data1和data2存储内容得知,data2的确将data1的8个字数据逆序存储。
5.实验任务5
实验效果截图:
用debug运行到line 27结果截图如下:
源代码中line 19的作用:将al与df h(即1101 1111)进行与操作,即将al从左数第三位变为0,从而实现将小写字母变成大写字母的操作。
将line4的改为db 5 dup(2),结果截图如下:
将line4的改为db 5 dup(5),结果截图如下:
由此可见,line4的作用是改变字体的颜色。
6.实验任务6
实验代码:
code segment start: mov ax, data mov ds,ax mov bx, 0 mov cx, 4 s0:push cx mov si, 0 mov cx, 4 s1:or byte ptr [bx+si], 00100000b inc si loop s1 add bx, 10h pop cx loop s0 mov ah, 4ch int 21h code ends end start
实验效果截图:
debug过程,g执行,d查看:
由截图得,每行第一个单词已经由大写变为小写。
7.实验任务7
实验代码:
code segment start: mov ax, data mov ds, ax mov ax, table mov es, ax mov bx, 0 ;存年份 mov si, 0 mov cx, 5 s0:mov ax, [si] mov es:[bx], ax mov ax, [si+2] mov es:[bx+2], ax add si, 4 add bx, 10h loop s0 mov bx, 0 ;存收入 mov si, 14h mov cx, 5 s1:mov ax, [si] mov es:[bx+5], ax mov ax, 0 mov es:[bx+5+2], ax add si, 2 add bx, 10h loop s1 mov bx, 0 ;存雇员数 mov si, 1eh mov cx, 5 s2:mov ax,[si] mov es:[bx+0ah], ax add si, 2 add bx, 10h loop s2 mov bx, 0 ;求商 mov cx, 5 s3:mov ax, es:[bx+5] mov dx, es:[bx+5+2] div word ptr es:[bx+0ah] mov es:[bx+0dh], ax add bx, 10h loop s3 mov ah, 4ch int 21h code ends end start
实验效果截图:
(对于收入只有两个字节的情况,我将高位存入00填满4个字节)
8.实验总结
本次实验,我充分认识到了汇编语言的繁琐性,也进一步懂得了汇编语言代码书写的规范。例如在实验任务2,我多次出现severe error的情况,后来发现是mov ax, b800h,在b800h前没有加0。
在汇编语言中规定:数值的字面书写一律不以字母开头,若以字母开头就认为不是数字而是符号。b800被认为是符号,必须加0让汇编程序认为他是数值。同时我也懂得了如何实现二次循环等方法。
实验8也是多次循环输出结果,同时也搞清了各个数据占的位数和字节数。