原创 汇编实验一:显示字符串

2010-12-19 18:24 4812 5 6 分类: 软件与OS

开始的时候有点畏惧写汇编的程序,因为汇编的程序有太多的指令需要记忆了,同时这个语言有点让人难以理解,但是经过我的一番复习之后,发现其实也并不是那么难,正所谓说:只要下功夫,没有事是不能成功的。


由于是第一次写我自己的汇编程序,所以今次我特别详细的写下的编程过程。


我的整个开发过程如下:


首先要理解汇编编程的过程:一,建立.asm文件,将masm.exe,debug.exe,link.exe复制到与源程序同一个文件目录下。打开.asm文件,在里面编写好程序  二,编写好程序之后,要检查程序有没有问题,这里要打开dos界面,进行对程序编译,cd是打开文件夹的意思,masm命令就是用来编译文件了,我建立的是1.asm文件,所以直接打上masm  1.asm就可以编译了,假如有错误系统与直接提示错误的地方和行,根据提示就可以进行修改了。三,link   1.obj就可以生成.exe文件了。直接运行exe文件文件就可以看到你所需要的结果,例如本实验就是显示字符串了。


讲完如何进行汇编写程序,编译程序和生成可执行文件,下面我来讲讲汇编程序具体怎么写,其实写汇编程序有一定的格式,这些格式一般都是固定的不需要修改直接套用就可以了。


汇编的一些固定格式:


;sample program display message;注释行
stack segment para stack'stack';定义堆栈段
      db 1024 dup(0) ;在存储器的某个区域建立一个堆栈区
stack ends


data segment   ;定义数据段
message db'This is a sample program.' ;在存储器中存放供显示的数据
        db 0dh,0ah,'$'
data ends


code segment    ;定义代码段
     assume cs:code,ds:data,ss:stack


start proc far       ;将程序定义为远过程 程序开始


。。。。。。。。。。。。。。。。。。。。


start endp  ;程序结束
code ends   ;代码结束
     end start


首先我们来分析这一代码段,一目了然,首先我们定义堆栈段


就是


stack segment para stack'stack';定义堆栈段
      db 1024 dup(0) ;在存储器的某个区域建立一个堆栈区
stack ends


这里建立了一个1024字的堆栈段


其次是定义数据段,用来存放数据


data segment   ;定义数据段
message db'This is a sample program.' ;在存储器中存放供显示的数据
        db 0dh,0ah,'$'
data ends


这里用来存放要显示的内容'This is a sample program’


最后我们要定义代码段:


code segment    ;定义代码段
     assume cs:code,ds:data,ss:stack


这里将所有的数据与段寄存器一一对应起来了,cs对应code,ds对应data,ss对应stack。正所谓:各司其职呀。


最最后就是程序结束啦,告诉系统我要结束了


start endp  ;程序结束
code ends   ;代码结束
     end start


中间部分就是程序核心部分了,


但是里面还是有一些固定格式需要注意的,就是


start proc far       ;将程序定义为远过程 程序开始
      push ds        ;固定格式
      mov ax,0
      push ax        ;标准序,以便返回dos操作系统
    
      mov ax,data   ;建立数据段的可寻地址性,固定格式
      mov ds,ax     ;初始化ds,固定格式
      lea bx,message ;message地址偏移量-》bx,固定格式
  


这一段程序开始之后我们有一段标准序,这一段的用处就是让程序方便返回到dos系统中


标准序如下:


start proc far       ;将程序定义为远过程 程序开始
      push ds        ;固定格式
      mov ax,0
      push ax        ;标准序,以便返回dos操作系统


其后就是我们要对数据段进行操作的话,我们要他提取出来就是下面的程序:


     mov ax,data   ;建立数据段的可寻地址性,固定格式
      mov ds,ax     ;初始化ds,固定格式
      lea bx,message ;message地址偏移量-》bx,固定格式


这段程序就是将data中的数据放在ds段里面,用bx来读出message的地址偏移量。


这样我们就完成了对程序系统的初始化,可以大展身手的去编写自己需要的程序了。我们需要实现的功能是显示字符串,具体程序如下


loop1:cmp byte ptr[bx],'$' ;比较字符是否等于$
      je loop2   ;是的话就跳转到loop2
      mov ah,2   ;2号dos功能调用输出字符,固定格式
      mov dl,[bx];将所要的打印的字符输给dl
      int 21h     ;dos系统功能
      inc bx    ;bx自加一,指向下一个字符
     jmp loop1  ;无条件跳转到loop1
loop2:ret  ;返回dos系统


我们建立两个需要,一个不断的循环显示字符,一个就是返回dos系统


分析程序如下:比较第dx位的数据是否等于‘$’结束符,结束的话就跳转到loop2,返回dos


没有结束的话就调用2号dos系统功能,将需要显示的字符赋给dl,执行功能就完成了一个显示,再然后对bx自加1 ,跳转loop1不断循环就可以了。


整体程序如下:


;sample program display message;注释行
stack segment para stack'stack';定义堆栈段
      db 1024 dup(0) ;在存储器的某个区域建立一个堆栈区
stack ends


data segment   ;定义数据段
message db'This is a sample program.' ;在存储器中存放供显示的数据
        db 0dh,0ah,'$'
data ends


code segment    ;定义代码段
     assume cs:code,ds:data,ss:stack
start proc far       ;将程序定义为远过程 程序开始
      push ds        ;固定格式
      mov ax,0
      push ax        ;标准序,以便返回dos操作系统
    
      mov ax,data   ;建立数据段的可寻地址性,固定格式
      mov ds,ax     ;初始化ds,固定格式
      lea bx,message ;message地址偏移量-》bx,固定格式
  
loop1:cmp byte ptr[bx],'$' ;比较字符是否等于$
      je loop2   ;是的话就跳转到loop2
      mov ah,2   ;2号dos功能调用输出字符,固定格式
      mov dl,[bx];将所要的打印的字符输给dl
      int 21h     ;dos系统功能
      inc bx    ;bx自加一,指向下一个字符
     jmp loop1  ;无条件跳转到loop1
loop2:ret  ;返回dos系统
start endp  ;程序结束
code ends   ;代码结束
     end start


      显示结果是:


This is a sample program.


与预想结果一致,完成了整个实验。


汇编实验感想,感觉汇编编程还是挺好玩的。希望以后能写出些好玩的程序。在这里不多说了。


今天到此为止。

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2013-6-21 12:42

可以帮个忙 写个java得 在线购物系统么
相关推荐阅读
用户307537 2011-07-12 01:24
ad603中文资料
ad603中文资料 2008-03-24 21:32:16|  分类: 电子设计 |  标签: |字号大中小 订阅 正文内容: 在很多信号采集系统中,信号变化的幅度都比较大,那么放大以后的信号幅...
用户307537 2011-06-10 20:39
电脑PC端下载电子市场(Market)软件,Android SDK模拟器安装电子市场(Market)
http://bbs.dospy.com/thread-10844471-1-404-1.html...
用户307537 2011-06-02 15:48
使用BSRR和BRR寄存器直接操作STM32的I/O端口
标签: STM32  GPIO   使用BSRR和BRR寄存器直接操作STM32的I/O端口 STM32的每个GPIO端口都有两个特别的寄存器,GPIOx_BSRR和GPIOx_BRR寄存器,通...
用户307537 2011-05-30 22:53
免费芯片申请地址
免费芯片申请地址 1、铁电存储器(未见量的限制,据说最多有人申请了100片,不知真假.)介绍:铁电存储器(FRAM)产品将ROM的非易失性数据存储特性和RAM的无限次读写、高速读写以及低功耗等优势结...
用户307537 2011-03-20 23:16
STM32高级控制定时器1学习
学习STM32这么久了,很想将所学到的东西总结一下,好让自己不会在遗忘中迷失。 高级控制定时器(Tim1)是由一个16位的自动装载计数器组成,它由一个可编程预分频器驱动。 用途在于:测量输入信号的脉冲...
用户307537 2011-03-20 01:02
2440串口纠结后
以前一直都是在纠结在串口中,现在终于解决了。我整个人都好像轻松了不少。我又可以进行我的嵌入式之旅了。原来市面上卖的串口线,有两种,一种是默认TXD和RXD相连的,而另外一种没有,所以,我不知道,刚刚好...
EE直播间
更多
我要评论
1
5
关闭 站长推荐上一条 /3 下一条