实验2 多个逻辑段的汇编源程序编写与调试

实验2 多个逻辑段的汇编源程序编写与调试

实验任务1

(1)task1_1.asm
image
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
image
结果于task1_1相同;
(3)task1_3.sam
image
1.DS=0770;SS=0772;CS-0774
2.data段地址X-4;stack段地址X-2;

此时分配的地址大小为20bit;因为内存大小2byte对齐,因此分配4byte。
(4)task1_4.asm
image
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

image

实验内容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


image

实验内容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

image

实验内容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个字节单元的值,重新汇编、链接、运行,观察结果。

image

image

image

修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果。
db 2,3,4,5,6 --> 改成: db 5 dup(2)

image

实验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

结果:

image

实验内容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
原始数据内存分布:

image
结构化后:

image

posted @ 2021-11-09 09:12  syp2021  阅读(34)  评论(3)    收藏  举报