实验2 多个逻辑段的汇编源程序编写与调试
任务1-1
(1)在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = 076A, 寄存器(SS) = 076B, 寄存器(CS) = 076C。
(2)假设程序加载后,code段的段地址是X,则,data段的段地址是X-2h, stack的段地址是X-1h。
任务1-2
(1)在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = 076A, 寄存器(SS) = 076B, 寄存器(CS) = 076C。
(2)假设程序加载后,code段的段地址是X,则,data段的段地址是X-2h, stack的段地址是X-1h。
任务1-3
(1)在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = 076A, 寄存器(SS) = 076C, 寄存器(CS) = 076E。
(2)假设程序加载后,code段的段地址是X,则,data段的段地址是X-4h, stack的段地址是X-2h。
任务1-4
(1)在debug中将执行到line9结束、line11之前,记录此时:寄存器(DS) = 076C, 寄存器(SS) = 076E, 寄存器(CS) = 076A。
(2)假设程序加载后,code段的段地址是X,则,data段的段地址是X+2h, stack的段地址是X+4h。
任务1-5
(1)对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是 2*[N/16] B。
(2)如果将程序task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm中,伪指令 end start 改成 end , 哪一个程序仍然可以正确执行?结合实践观察得到的结论,分析、说明原因。
答:task1_4.asm仍然可以正常运行,由任务1-1可知DS和CS之间的地址默认相差10h,如果没有指出程序的开始位置,程序默认从DS+10h开始运行,将end start改成end,使用-r查看寄存器,可以看到CS的值为076A,而非原来的076C,使用反汇编进行查看,可以发现CS开始的区域全部为0,没有可供执行的指令。
任务2
实验代码:
assume cs:code code segment start: mov ax,0b800h mov ds,ax mov bx,0f00h mov cx,50h;50h即80 mov ax,0403h s: mov ds:[bx],ax add bx,2 loop s mov ah,4ch int 21h code ends end start
运行结果:
任务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 ax,data1 mov ds,ax mov bx,0 mov cx,0ah s: mov ax,ds:[bx] add ax,ds:[bx+10h] mov ds:[bx+20h],ax inc bx loop s mov ah,4ch int 21h code ends end start
反汇编:
相加前:
相加后:
任务4
实验代码:
assume cs:code,ss:stack data1 segment dw 2, 0, 4, 9, 2, 0, 1, 9 data1 ends data2 segment dw 8 dup(?) data2 ends stack segment dw 8 dup(?) stack ends code segment start: mov ax,stack mov ss,ax mov sp,8 mov ax,data1 mov ds,ax mov bx,0 mov cx,8 s: push [bx] add bx,2 loop s mov ax,data2 mov ds,ax mov bx,0 mov cx,8 s2: pop [bx] add bx,2 loop s2 mov ah, 4ch int 21h code ends end start
存储前:
存储后:
任务5
运行结果:
答:line19的作用是将小写字母转换成大写字母。
将line 4修改为:db 5 dup(2),运行结果:
答:line4的作用是设置颜色。
任务6
实验代码:
assume cs:code, ds:data, ss:stack data segment db 'Pink Floyd ' db 'JOAN Baez ' db 'NEIL Young ' db 'Joan Lennon ' data ends stack segment dw 1 dup(?) stack ends code segment start: mov ax,stack mov ss,ax mov sp,1 mov ax,data mov ds,ax mov ax,data mov es,ax mov cx,4 s: push cx mov bx,0 mov cx,4 s2: mov al,es:[bx] or al,20h mov es:[bx],al inc bx loop s2 pop cx mov ax,es inc ax mov es,ax loop s mov ah, 4ch int 21h code ends end start
转换前:
反汇编:
转换后:
任务7
实验代码:
assume cs:code, ds:data, es:table,ss:stack data segment db '1975', '1976', '1977', '1978', '1979' dd 16, 22, 382, 1356, 2390 dw 3, 7, 9, 13, 28 data ends table segment db 5 dup( 16 dup(' ') ) ; table ends stack segment dw 1 dup(?) stack ends code segment start: mov ax,stack mov ss,ax mov sp,1 mov ax,data mov ds,ax mov ax,table mov es,ax mov di,0;data ;1 mov bx,0;table mov si,0;table mov cx,5 year: push cx mov cx,4 year2: mov al,ds:[di] mov es:[bx+si],al inc si inc di loop year2 pop cx add bx,10h mov si,0 loop year ;2 mov bx,0 mov si,5 mov cx,5 income: push cx mov cx,4 income2: mov al,ds:[di] mov es:[bx+si],al inc si inc di loop income2 pop cx add bx,10h mov si,5 loop income ;3 mov bx,0 mov si,10 mov cx,5 num: push cx mov cx,2 num2: mov al,ds:[di] mov es:[bx+si],al inc si inc di loop num2 pop cx add bx,10h mov si,10 loop num ;4 mov bx,0 mov si,5 mov cx,5 cal: mov ax,word ptr es:[bx+si] add si,2 mov dx,word ptr es:[bx+si] add si,3 div word ptr es:[bx+si] add si,3 mov word ptr es:[bx+si],ax add bx,10h mov si,5 loop cal mov ah, 4ch int 21h code ends end start
运行结果:
结构化写入后: