汇编语言第六章总结

时间:2022-08-07 01:15:58

包含多个段的程序

下面将知识点总结如下:

一、如何累加给定的数值数据?

1、首先要将数据存储在连续内存单元中,但我们不能自己随便决定哪段空间是可以使用的,要让系统为我们分配

可以用dw命令存储数据,此时编译链接后cs:0的值指向数据首地址,如:

dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

其中dw定义了8个型数据,占内存空间大小为16个字节,代码段偏移地址为0,2,4,6……,即CS:0,CS:2,CS:4,CS:6……

用寄存器bx累加时注意应每次加2

2、因为cs前16个内存单元用来存放数据,所以程序应从这16个内存单元后开始执行

具体:1.用start:放在程序开始处

   2.在最后一个end处加上start(start只是标号,也可以自定字符)

end除了通知编译器程序结束,还通知编译器程序的入口在什么地方

end start指明程序的入口,被转化为入口地址,存储在可执行文件的描述信息中,加载时程序从描述信息中读到入口地址,设置CS:IP

二、在代码段中使用栈

dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0(16个字型数据作为栈段

将CS:10~CS:2F内存单做栈来用,SS:SP指向栈底CS:30

dw既可定义数据,也可以说用它开辟内存空间

三、将数据、代码、栈放入不同的段

产生原因:1.开辟数据和段使得程序混乱

        2.一个段容量不能大于64KB

assume cs:code,ds:data,ss:stack

data segment

dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

data ends

stack segment

dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

stack ends

code segment

start:mov ax,stack

     mov ss,ax

   mov sp,20h

   mov ax,data

   mov ds,ax

   mov bx,0

   mov cx,8

s:     push [bx]

   add bx,2

   loop s

   mov bx,0

   mov cx,8

s0:   pop [bx]

   add bx,2

   loop s0

   mov ax,4c00h

   int 21h

code ends

end start

注意:

1、不同段要有不同段名

2、段名相当于一个标号,代表了段地址,是数字形式而非寄存器形式,所以 mov ds,data错误

3、assume是伪指令,cs:code,ds:data,ss:stack,不会将相应寄存器和段code、stack、data链接