实验二
实验任务1
任务1-1

① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = 076A, 寄存器(SS) = 076B, 寄存器(CS) =076C
② 假设程序加载后,code段的段地址是X,则,data段的段地址是X-12H, stack的段地址是X-3H。
任务1-2

① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = 076A, 寄存器(SS) = 076B, 寄存器(CS) =076C
② 假设程序加载后,code段的段地址是X,则,data段的段地址是X-12H, stack的段地址是X-3H。
任务1-3

① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = 076A, 寄存器(SS) = 076C, 寄存器(CS) =076E
② 假设程序加载后,code段的段地址是X,则,data段的段地址是X-14H, stack的段地址是X-5H。
任务1-4

① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = 076C, 寄存器(SS) = 076E, 寄存器(CS) =076A
② 假设程序加载后,code段的段地址是X,则,data段的段地址是X-10H, stack的段地址是X-1H。
任务1-5
① 对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是 ((N-1)/16+1)*16字节。
② 如果将程序task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm中,伪指令 end start 改成 end , 哪一个程序仍然可以正确执行?结合实践观察得到的结论,分析、说明原因。
task1_1.asm

task1_2.asm

task1_3.asm

task1_4.asm

只有task1_4可以正常运行,在汇编语言中start既可以作为标号也可以作为程序入口,而end start的作用就是提示程序入口在何处。若程序的第一条指令就是程序的入口,则start可以缺省。若最后缺少start,则会引起系统调用时不知道程序的入口在何处,从第一条指令开始执行,而在这种情况下,只有task1_4符合。
实验2

代码:
assume cs:codesg codesg segment start:mov ax,0b800h mov ds,ax mov cx,80 mov bx,0f00h s: mov ax,403h mov [bx],ax add bx,2 loop s mov ax,4c00h int 21h codesg ends end
实验3
加载、反汇编:

运行前:

调试:

运行后:

代码:
assume cs:code,ds:data1 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 ax,data1 mov ds,ax mov cx,10 mov si,0 s: mov al,[si] add ax,[16+si] mov [32+si],al inc si loop s mov ax,4c00h int 21h code ends end start
实验4

运行后:

assume cs:code,ds:data1 data1 segment dw 2, 0, 4, 9, 2, 0, 1, 9 data1 ends data2 segment dw 8 dup(0) data2 ends code segment start:mov ax,data1 mov ds,ax mov si,0 mov bx,14 mov cx,8 s: mov ax,[bx] mov [16+si],ax inc si inc si dec bx dec bx loop s mov ah, 4ch int 21h code ends end start
实验5
代码:
assume cs:code, ds:data data segment db 'Nuist' db 2, 3, 4, 5, 6 data ends code segment start: mov ax, data mov ds, ax mov ax, 0b800H mov es, ax mov cx, 5 mov si, 0 mov di, 0f00h s: mov al, [si] and al, 0dfh mov es:[di], al mov al, [5+si] mov es:[di+1], al inc si add di, 2 loop s mov ah, 4ch int 21h code ends end start
反汇编:

运行结果:

修改后运行结果:

line19的作用:将字母大写
line4的字节数据的用途:操控显示字母的颜色
实验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 si,0 mov dl,20h or [si],dl or [si+16],dl or [si+32],dl or [si+48],dl 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 s: mov ax,[bx] mov es:[si],ax mov ax,[bx+2] mov es:[si+2],ax add si,16 add bx,4 loop s mov bx,20 mov cx,5 mov si,0 mov di,0 s1: mov dx,0 mov es:[di+7],dx mov ax,[bx+si] mov es:[di+5],ax div word ptr [bx+10+si] mov es:[di+13],ax mov ax,[bx+10+si] mov es:[di+10],ax add di,16 add si,2 loop s1 mov ah, 4ch int 21h code ends end start
table原始数据:

table运行后数据:

实验总结
本次实验主要研究的对象为程序的各个段的使用及各种寻址方法,较之前次实验也多使用了几个寄存器。同时,对汇编代码中的伪指令、标记等的用途也有了更深层次的理解。

浙公网安备 33010602011771号