一 理解基础编译
伪指令->用于编译器识别
汇编指令->编译为机器码
assume :含义为“假设”。它假设某一段寄存器和程序中的某一个用segment ... ends定义的段相关联。
segment和ends的功能是定义一个段。segment说明一个段开始,ends说明一个段结束。
End是一个汇编程序的结束标记,编译器在编译汇编程序的过程中,如果碰到了伪指令end,就结束对源程序的编译。
连接的作用有以下几个:
- 当源程序很大时,可以将它分为多个源程序文件来编译,每个源程序编译成为目标文件后,再用连接程序将它们连接到一起,生成一个可执行文件;
- 程序中调用了某个库文件中的子程序,需要将这个库文件和该程序生成的目标文件连接到一起,生成一个可执行文件;
在MASM中:
mov al, [0] =>al=0
mov al, ds:[0] =>把段地址为ds:0处的内容给al
二 理解段编程
2.1 代码段中使用数据
“dw”的含义是定义字型数据。(dw即define word)
(1)这8个数据的偏移地址是多少呢?
因为用dw定义的数据处于代码段的最开始,所以偏移地址为0,这8个数据就在代码段的偏移0、2、4、6、8、A、C、E处。
(2)如何将8个数据相加?
在循环开始前,设置(bx)=0,cs:bx指向第一个数据所在的字单元。每次循环中(bx)=(bx)+2,cs:bx指向下一个数据所在的字单元。
(3)如何将上述程序变成一个可执行程序呢?
源程序的最后用“end start",end将告诉CPU程序的入口,这个入口将被写入可执行文件的描述信息,可执行文件中的程序被加载入内存后,CPU的CS:IP被设置指向这个入口,从而开始执行程序中的第一条指令。
标号“start”"在“code"段中,这样CPU就将code段中的内容当作指令来执行了。
2.2 代码段中使用栈
例:完成下面的程序,利用栈,将程序中定义的数据逆序存放。
assume cs:codesg
codesg segment
dw 0123h,O456h,O789h ,Oabch,0defh,O fedh ,0cbah,0987h
?
code ends
(1)程序设计的思路大致如下:
程序运行时,定义的数据存放在cs:0~cs:15单元中,共8个字单元。依次将这8个字单元中的数据入栈,然后再依次出栈到这8个字单元中,从而实现数据的逆序存放。
(2)问题是如何获取栈空间呢?
我们可以在程序中通过定义数据来取得一段空间,然后将这段空间当作栈空间来用。我们要将cs:16~ cs:31的内存空间当作栈来用,初始状态下栈为空,所以ss:sp要指向栈底,则设置ss:sp指向cs:32。
2.3 不同段的编程
背景:一个段的容量不能大于64KB,是我们在学习中所用的8086模式的限制,并不是所有的处理器都这样。
方法:我们用和定义代码段一样的方法来定义多个段,然后在这些段里面定义需要的数据,或通过定义数据来取得栈空间。
注意:如果段中的数据占N个字节,则程序加载后,则段实际占有的空间:
16×(N/16+1)
三 字符串编程
3.1 大小写转换
A:01000001 a:01100001区别在于第5位不同
C语言如下:
四 数据处理
4.1 数据存放
(1)源数据data在哪里?
DS中年份(0-53H)、收入(54H-0A7H)、雇员(0A8H-OD1H)
(2)目标数据table为什么放在ES里?
因为ds被data占用了。
4.2 call与ret
数据存放在bx中