汇编程序练习

一 理解基础编译

伪指令->用于编译器识别

汇编指令->编译为机器码

assume :含义为“假设”。它假设某一段寄存器和程序中的某一个用segment ... ends定义的段相关联。

segment和ends的功能是定义一个段。segment说明一个段开始,ends说明一个段结束。

End是一个汇编程序的结束标记,编译器在编译汇编程序的过程中,如果碰到了伪指令end,就结束对源程序的编译。

连接的作用有以下几个:

  1. 当源程序很大时,可以将它分为多个源程序文件来编译,每个源程序编译成为目标文件后,再用连接程序将它们连接到一起,生成一个可执行文件;
  2. 程序中调用了某个库文件中的子程序,需要将这个库文件和该程序生成的目标文件连接到一起,生成一个可执行文件;

在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中

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值