这个实验开始的填空题我就不写了,想看的引入别人的文章:点击打开链接
解释一下三个填空题目的区别:
1和2的区别就是无论你的段申请够不够16个字节,计算机都会帮你直接申请够一行,也就是16个字节。
所以第2题最后一个填空题答案为((n/16)+1)*16 其中(n/16)就是判断你申请的有木有超过一行,因为会去掉小数,所以要加上1,最后乘回16就是答案
2和3的却别就是你定义的段在不同位置,他们开始的段地址也会不同
5、程序如下,编写code段总的代码。将a段和b段总的数据依次相加,结果保存在c段中
代码如下:
assume cs:code a segment db 1,2,3,4,5,6,7,8 a ends b segment db 1,2,3,4,5,6,7,8 b ends c segment db 0,0,0,0,0,0,0,0 c ends code segment start: mov ax,a mov ds,ax ;将ds指向a数据段 mov ax,b mov ss,ax ;将ss指向b数据段 mov ax,c mov es,ax ;es指向c的数据段 mov bx,0 mov cx,8 s0: mov ax,ds:[bx] add ax,ss:[bx] mov es:[bx],ax inc bx loop s0 mov ax,4c00h int 21h code ends end start
只需要将a、b、c段分给三个不同的段寄存器,然后循环8次相加就行,注意的是要用寄存器来写入内存,不能直接写入。
6、程序如下,编写code段总的代码,用push指令将a段中的前8个字型数据,逆序存储到b段中。
assume cs:code a segment dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh a ends b segment dw 0,0,0,0,0,0,0,0 b ends code segment start: mov ax,a mov ds,ax mov bx,0 mov ax,b mov ss,ax mov sp,10h mov cx,8 s: push [bx] add bx,2 loop s mov ax,4c00h int 21h code ends end start
分析:这个实验跟上一个实验是一样的想法,就是先定好段寄存器。然后push就ok了