实验任务1
1-1
对程序task1_1.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。
task1_1.asm
① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = 076AH, 寄存器(SS) = 076BH, 寄存器(CS) = 076CH
② 假设程序加载后,code段的段地址是X,则,data段的段地址是 x-2, stack的段地址是 x-1。
任务1-2
对程序task1_2.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。
task1_2.asm
① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = 076AH, 寄存器(SS) = 076BH, 寄存器(CS) = 076CH
② 假设程序加载后,code段的段地址是X,则,data段的段地址是 x-2, stack的段地址是 x-1。
任务1-3
对程序task1_3.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。
task1_3.asm
① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = 076AH, 寄存器(SS) = 076CH, 寄存器(CS) = 076EH
② 假设程序加载后,code段的段地址是X,则,data段的段地址是 x-4, stack的段地址是 x-2。
任务1-4
对程序task1_4.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。
task1_4.asm
① 在debug中将执行到line9结束、line11之前,记录此时:寄存器(DS) =076CH , 寄存器(SS) = 076EH, 寄存器(CS) = 076A
② 假设程序加载后,code段的段地址是X ,则,data段的段地址是 X+2, stack的段地址是 X+4。
任务1-5
基于上述四个实验任务的实践、观察,总结并回答:
① 对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是 _(1)能整除时,为N(2)不能整除时,为N+16_。
② 如果将程序task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm中,伪指令 end start 改成end , 哪一个程序仍然可以正确执行?结合实践观察得到的结论,分析、说明原因。
task1_4仍然可以正确执行。没有了伪指令,exe文件被加载在内存中,首先将CS:IP指向程序的首地址。而只task1_4的程序中一开始定义的是代码段,所以CS:IP指向了指令的首地址。task1_1-1_3的程序中一开始定义的是数据段,所以cs:ip指向了数据的首地址而非指令,而CPU会把数据段中的数据当中机器指令来执行。
编写一个汇编源程序,实现向内存单元b800:0f00 ~ b800:0f9f连续160字节,依次重复填充十六进制数据03 04。
源代码
assume cs:code code segment start: mov ax, 0b800h mov ds, ax mov bx, 0f00h mov cx, 50h s: mov [bx], 0403h add bx, 2 loop s mov ah, 4ch int 21h code ends end
源代码:
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 ax, data1 mov ss, ax mov ax, data2 mov es, ax mov ax, data3 mov ds, ax mov bx, 0 mov cx, 10 s:mov al, ss:[bx] add al, es:[bx] mov [bx], al add bx, 1 loop s mov ah, 4ch int 21h code ends end start
首先查看之前data1和data2内容
这是循环之后相加的结果,可知data1和data2相加存到了data3中。
源代码:
assume cs:code, ss:data1, ds:data2 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 ax, data2 mov ss, ax mov sp, 10h mov bx, 0 mov cx, 8 s:push [bx] add bx, 2 loop s mov ah, 4ch int 21h code ends end start
用d命令查看循环执行前后的内存空间,发现data1的内容确实被逆序复制到了data2处。
调试结果:出现彩色NUIST
2.Line 19 的作用:将小写字母转换成大写字母
3.db 2,3,4,5,6 --> 改成: db 5 dup(2)
实验结果:NUIST变成绿色
db 2,3,4,5,6 --> 改成: db 5 dup(5)
实验结果:NUIST变成紫色
数值的作用可能是设置不同的颜色
源代码:
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
实验结果:首先查看原先数据
运行后:大写变小写
源代码:
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 si,0 mov bx,0 s: mov ax,[si] mov es:[bx],ax ;输入19 mov ax,[si+2] mov es:[bx+2],ax ;输入年份中后两位 add bx,10h add si,4 loop s mov cx,5 mov si,20 mov bx,5 s1:mov ax,[si] mov es:[bx],ax mov ax,0 mov es:[bx+2],ax add bx,16 add si,2 loop s1; mov cx,5 mov si,30 mov bx,10 s2:mov ax,[si] mov es:[bx],ax add bx,16 add si,2 loop s2 mov cx,5 mov si,5 s3:mov ax,es:[si] mov bl,es:[si+5] div bl mov es:[si+8],al add si,16 loop s3 mov ah, 4ch int 21h code ends end start