实验2 多个逻辑段的汇编源程序编写与调试
实验2 多个逻辑段的汇编源程序编写与调试
实验任务1
(1)task1_1.asm
1.DS=0770; SS=0771; CS=0772
2.data段地址为X-2;stack段地址为X-1;
由于data段、stack段刚好各分配了16B的单位,而系统为段内存分配都是以16B为单位分配的,由于物理地址 = 段地址 × 16 + 偏移地址,因此相隔16B正好段地址相差1H
(2)task1_2.asm
结果于task1_1相同;
(3)task1_3.sam
1.DS=0770;SS=0772;CS-0774
2.data段地址X-4;stack段地址X-2;
此时分配的地址大小为20bit;因为内存大小2byte对齐,因此分配4byte。
(4)task1_4.asm
1.DS=0772;SS=0774;CS=0770;
2.data段地址X+2;stack段地址X+4;
地址的变化与分配内存的顺序相关
(5)task1_5.asm
1.实际分配[(N/16)] (向上取整)byte大小的空间
2.task4任然可以运行
原因:查看书本可以得知,end start不仅仅有着提示程序代码在哪里结束的作用,同时也提醒程序代码从何处开始,若是去掉了start,系统默认地将整个程序的开始作为代码的起始,而实验1-1到1-3,程序的开始是对数据段和栈段的预留,不是代码段,因此程序不可以正确运行,而实验1-4改变了这几段的顺序,将代码段放在了最前,因此没有影响。
实验内容2
代码:
点击查看代码
start:
mov ax, 0b800h
mov ds, ax
mov bx, 0f00h
mov cx, 80
mov ax, 0403h
s: mov ds:[bx], ax
add bx, 2
loop s
mov ah, 4ch
int 21h
codes ends
end start
实验内容3
代码:
点击查看代码
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, 10 ;10组数据
s: mov ax, [bx] ; 写入data1
add ax, [bx+10h] ; 把data1+data2
mov [bx+20h], ax ; 存入data3
inc bx
loop s
mov ah, 4ch
int 21h
code ends
end start
实验内容4
补全代码:
点击查看代码
data1 segment
dw 2, 0, 4, 9, 2, 0, 1, 9
data1 ends
data2 segment
dw 8 dup(?)
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
实验内容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
阅读源程序,从理论上分析源代码的功能,尤其是line15-25,循环实现的功能是什么,逐行理解每条指令的功能。
对程序进行汇编、链接,得到可执行文件,运行并观察结果。
分析结果:
分析第19行中 做了一个与运算,并且是00dfh,转换为2进制是1101 1111,这个2进制在程序中与其他2进制数做与运算,得到的结果是其他位置不变,第三位变成0,恰好符合字母在ASCII中小写与大写的对应关系,所以在这里,这第19行的作用是将小写转换为大写。
修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果。
修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果。
db 2,3,4,5,6 --> 改成: db 5 dup(2)
实验6
补全代码:
点击查看代码
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 bx, 0
mov cx, 4
s0:mov ax, cx
mov cx, 4
s: or byte ptr [bx], 20h
inc bx
loop s
add bx, 12
mov cx, ax
loop s0
mov ah, 4ch
int 21h
code ends
end start
实验内容7
补全代码:
点击查看代码
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 bx,0
mov si,0
mov cx,5
s1: mov ax,ds:[bx]
mov es:[si],ax
add bx,2
add si,2
mov ax,ds:[bx]
mov es:[si],ax
add bx,2
add si,14
loop s1
mov bx,20
mov si,5
mov cx,5
s2: mov ax,ds:[bx]
mov es:[si],ax
add si,2
mov word ptr es:[si],0
add bx,2
add si,14
loop s2
mov bx,30
mov cx,5
mov si,10
s3:mov ax,ds:[bx]
mov es:[si],ax
add bx,2
add si,16
loop s3
mov bx,20
mov di,30
mov cx,5
mov si,13
s4: mov ax,ds:[bx]
mov dx,0
div word ptr ds:[di]
mov es:[si],ax
add bx,2
add di,2
add si,16
loop s4
mov ah, 4ch
int 21h
code ends
end start
结构化后: