实验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
运行结果:
结构化写入后: