Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1611523
  • 博文数量: 185
  • 博客积分: 10363
  • 博客等级: 上将
  • 技术积分: 2205
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-11 22:29
文章分类
文章存档

2013年(12)

2012年(5)

2011年(2)

2010年(12)

2009年(9)

2008年(15)

2007年(48)

2006年(82)

分类: WINDOWS

2006-06-05 11:11:41

第四讲 汇编程序

4.1 汇编程序框架

data SEGMENT '数据段,编程者可以把数据都放到这个段里
....数据部分
'数据格式是: 标识符 db/dw 数据。
data ENDS'数据段结束处。

edata SEGMENT '附加数据段,编程者可以把数据都放到这个段里
....附加数据部分
edata ENDS'附加数据段结束处。

code SEGMENT'代码段,实际的程序都是放这个段里。
      ASSUME CS:code,DS:data,ES:edata '告诉编译程序,data段是数据段DS,code段是代码段CS
start:MOV AX,data '前面的start表示一个标识位,后面用到该位,如果用不到,就可以不加
      MOV DS,AX '这一句与上一行共同组成把data赋值给DS。段寄存器.
      MOV AX,edata
      MOV ES,AX '与前一句共同组成edata->ES
      .......程序部分
      MOV AX,4C00h'程序退出,该句内存由下一行决定。退出时,要求ah必须是4c。
      INT 21h
code ENDS'代码段结束。
END start'整个程序结束,并且程序执行时由start那个位置开始执行。


上面就是一个程序的框架结构。在这个结构中,有三个段,DS,ES,CS。这三个段分别存数据,附加数据,代码段。

4.2 编写我们的Hello,world思路。
开始编写我们的第一个程序。
程序要求:显示一个“Hello,Mr.286.”怎么样?
思路:
1 要显示一个字符串,根据前面我让你们记的七八个指令够吗?答案是:不仅够,而且还用不完。
首先定义一下总可以吧。

hellostr db 'Hello,Mr.286.$'
最后的$不要忘了。

2 首先要考虑的问题就是找中断,找到合适的中断,该中断就能帮我们完成这个显示任务。我找到(在哪找到的,怎么找到的,别问我,到网上或书上都能找到):
-------------------------------------------
中断INT 21H功能09H

功能描述: 输出一个字符串到标准输出设备上。如果输出操作被重定向,那么,将无法判断磁盘已满
入口参数: AH=09H
DS:DX=待输出字符的地址
说明:待显示的字符串以’$’作为其结束标志
出口参数: 无
-------------------------------------------
由上面看到,我们所需要作的就是把DS指向数据段,DX指向字符串的地址,AH等于9H,调用21h中断。
mov ds,数据段地址
lea dx,hellostr 'hellostr已在前面1中定义了。
mov ah,9h
int 21h。
由于只要在调用int 21h之前把准备的东西准备齐就行了,所以int 21h前面三行的顺序并不重要。

3 退出程序,运行完总要退出呀。再查中断手册
--------------------------------------------
中断INT 21H功能4CH

功能描述: 终止程序的执行,并可返回一个代码
入口参数: AH=4CH
AL=返回的代码
出口参数: 无

--------------------------------------------
mov ah,4Ch
mov al,0
int 21h

mov ax,4c00h
int 21h
这里需要说明的是返回代码有什么用,返回给谁?返回给操作系统,因为是操作系统DOS调用的这个程序,这个返回值可以通过批处理中的errorlevel得到,这里不多说明,实际上操作系统很少处理这一值,因此al你随便写什么值影响都不大。

4.3 程序实现
data SEGMENT
msg DB 'Hello, Mr.286.$'
data ENDS

code SEGMENT
      ASSUME CS:code,DS:data
start:MOV AX,data
      MOV DS,AX
      lea dx,msg
      mov ah,9h
      int 21h
      MOV AX,4C00h
      INT 21h
code ENDS
END start

4.4 编译运行。
把上面程序保存成hello286.asm后,就可以编译运行了。进入DOS,进入汇编目录,如果还没下载,到前面找下载地址。

=================================================
E:\Download\Masm>masm hello286.asm
Microsoft (R) Macro Assembler Version 5.00
Copyright (C) Microsoft Corp 1981-1985, 1987.  All rights reserved.

Object filename [hello286.OBJ]:
Source listing  [NUL.LST]:
Cross-reference [NUL.CRF]:

  50408 + 415320 Bytes symbol space free

      0 Warning Errors
      0 Severe  Errors
说明:上面连续三个回车,表示我要的都是默认值。下面是零个警告,零个严重错误,(当然了,我的程序还敢错吗?)

E:\Download\Masm>link hello286

Microsoft (R) Overlay Linker  Version 3.60
Copyright (C) Microsoft Corp 1983-1987.  All rights reserved.

Run File [HELLO286.EXE]:
List File [NUL.MAP]:
Libraries [.LIB]:
LINK : warning L4021: no stack segment

说明:三个回车仍要默认,后面有个警告,没有栈段,这个没关系,没有的话系统会自动给一个()。

E:\Download\Masm>hello286
Hello, Mr.286.
说明:运行成功。
E:\Download\Masm>
===================================================
阅读(3534) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-04-01 22:53:10

引用:“该中断就能帮我们完成这个显示任务。我找到(在哪找到的,怎么找到的,别问我,到网上或书上都能找到):” 555~~ 你也知道书上对中断很不重视 哪里看得懂 大虾 你就好事做到底吧 55~~