社区
汇编语言
帖子详情
程序退出,用int 20h和mov ax,4ch,int 21h这两种有什么区别么?
absolutlyy
2011-09-21 10:55:25
什么时候必须int 20h来退出程序?
什么时候必须
mov ax,4ch,
int 21h
来退出程序?
...全文
934
2
打赏
收藏
程序退出,用int 20h和mov ax,4ch,int 21h这两种有什么区别么?
什么时候必须int 20h来退出程序? 什么时候必须 mov ax,4ch, int 21h 来退出程序?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
zara
2011-09-21
打赏
举报
回复
用 int20h 结束程序,最起码要求 cs 指向 psp,否则会出错。
mov ax, 4ch 再 int21h 这个方法,你这写法是错误的,4ch 应该是在 ah 里,即大致是 mov ah,4ch 或 mov ax, 4c00h 之类的。这个结束方法就简单得多,没有什么特别的要求,还可以指定程序结束码,供后面程序或批处理进行该程序运行结果的分析以采用相应的下一步动作。
Areslee
2011-09-21
打赏
举报
回复
就退出本身而言没有区别
有区别的是int 21h可以返回错误码,int20h不可以
双端口课程设计
很有用的,大家都来吧;有编辑功能:Backspace键用于删除字符;上下左右键可以任意角度方向的移动 ;光标;Esc键用于
退出
本软件,同时提示是否保存,若输入Y,则软件将自动把已发送 ;的字符保存在指定文件夹中,初始值指定为'c:\masm\L.txt'中; ;聊天功能:发送字符串后,发送端自动换行;接收端有‘Rec:’字样提示收到了 ;字符;接收字符串基于中断 ;;作者:xuehui869^_^电子邮箱:xuehui869@163.com^_^时间 :2008年3月27日23:35:11 DATA SEGMENT MEMORYBUFFER DB 1000 DUP(?) FILE DB 'c:\masm\L.txt' , 0 ;创建文件的文件名 ERROR_MESSAGE DB 0AH , 'error !' , '$' ;出错时的提示 MESSAGE DB 0AH , 'ok !$' ;操作成功后的提示 HANDLE DW ? ;保存文件号 SENDBUFFER DB 1000 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS: CODE , DS:DATA START: ;主
程序
部分
MOV
AX
, DATA
MOV
DS ,
AX
MOV
SI,OFFSET SENDBUFFER
MOV
DI,OFFSET MEMORYBUFFER ;用于存储接收和已发送的数据
MOV
BP,OFFSET SENDBUFFER ;用于判断发送区是否为空,以利于判断DEL键是否进行删除 ;
MOV
AH,0 ;这些背景色必须加在声明语句中,在主循环中不行 ;
MOV
AL,11000011B ;
MOV
AL,42H ;
INT
10H
MOV
AH,0BH ;加边框
MOV
BH,0
MOV
BL ,200
INT
10H
MOV
AH , 35H ;
MOV
AL , 0CH ;
INT
21H
;读取原0CH号中断服务
程序
的地址 PUSH BX PUSH ES ;以上地址入栈保存(以便在
程序
退出
时再恢复中断矢量表中的内容)
MOV
AX
, CS ;
MOV
DS ,
AX
;
MOV
DX , OFFSET REC
INT
ERRUPT ;
MOV
AH , 25H ;
MOV
AL , 0CH ;
INT
21H
;修改中断矢量表,将NET_
INT
位置登记为0CH号中断服务
程序
的地址 ;以下初始化8250
MOV
DX , 3FBH ;指向线路控制寄存器
MOV
AL , 80H ;位7置1 OUT DX , AL ;发送此字节
MOV
DX , 3F9H ;指向波特率除数的高字节
MOV
AL , 0 ; 1200 BPS对应的高字节 OUT DX , AL ;发送此字节 DEC DX ;指向波特率除数的低字节
MOV
AL , 60H ; 1200 BPS对应的低字节 OUT DX , AL ;发送此字节 ;
MOV
AL , 1BH ;数据长度为8位 , 1个奇偶校验位 , 偶校验 , 1个停止位
MOV
AL , 13H ;数据长度为8位 , 无奇偶校验位 , 1个停止位
MOV
DX , 3FBH ;指向线路控制寄存器 OUT DX , AL ;发送此字节
MOV
DX , 3FCH ;设置MODEM控制寄存器
MOV
AL , 0BH ;允许8250发中断 OUT DX , AL
MOV
DX , 3F9H ;指向中断允许寄存器
MOV
AL , 1 ;允许数据接收准备好中断 OUT DX , AL ;发送此字节 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;这一段很关键,但往往被遗忘 CLI ;关中断,以便对中断控制器8259A进行操作 IN AL ,
21H
;读取中断屏蔽寄存器的内容 AND AL , 0EFH ;将COM1中断(即IRQ4引脚)的对应位置0,允许中断。 OUT
21H
, AL ;写入中断控制器8259A中 STI ;开中断 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;超级死循环 ,主要是发送
程序
部分 ,主
程序
循环,等待收到字符的中断发生。;
MOV
AX
, DATA
MOV
DS ,
AX
WAITSENDSTRING:
MOV
AH,1 ; 键盘缓冲区是否有字符?
INT
16H ; JZ WAITSENDSTRING ; 无,继续查询
MOV
AH,0 ;从键盘缓冲区取字符到AL ,当读了之后,缓冲区清空;不然,键盘缓冲去一直有数据
INT
16H ; CMP AL,00011011B ;是否为
退出
键Esc JNZ A ;不是,转A继续判断 JMP EXIT ;是,转EXIT,进行
程序
退出
处理 A: CMP AH,48H ;是否为“上”键 JZ KEY_UP ;是,转上处理
程序
CMP AH,50H ;下 JZ KEY_DOWN CMP AH,4BH ;左 JZ KEY_LEFT CMP AH,4DH ;右 JZ KEY_RIGHT CMP AL,08H ; 接收到的数据是Del键吗 JNZ OK ; 不是,则转OK CMP BP,SI ;现在没有字符吗 ;本步的功能在于容错处理 JZ OK ; 是,则转OK,不进行删除
MOV
AH,02H ;;不是,执行删除字符
程序
MOV
DL,08H ; DL ='Del'的ASCII码
INT
21H
;
MOV
DL,00H ; DL ='NULL'的ASCII码
INT
21H
;
MOV
DL,08H ; DL ='Del'的ASCII码
INT
21H
; DEC SI ;删除存储区内的一个字符 JMP WAITSENDSTRING KEY_UP:
MOV
AH,03H ;使光标上移
MOV
BH ,00H
INT
10H DEC DH
MOV
AH,02H
INT
10H JMP WAITSENDSTRING KEY_DOWN:
MOV
AH,03H ;使光标下移
MOV
BH ,00H
INT
10H INC DH
MOV
AH,02H
INT
10H JMP WAITSENDSTRING KEY_LEFT:
MOV
AH,03H ;使光标左移
MOV
BH ,00H
INT
10H DEC DL
MOV
AH,02H
INT
10H JMP WAITSENDSTRING KEY_RIGHT:
MOV
AH,03H ;使光标右移
MOV
BH ,00H
INT
10H INC DL
MOV
AH,02H
INT
10H B: JMP WAITSENDSTRING ;;;;;;;;;;;;;;;;;;;;;;;;;;;;向标准输出外设(如显示器)输出单个字符 OK:
MOV
AH,02H ;
MOV
DL,AL ; DL =输出字符的ASCII码
INT
21H
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;将从键盘缓冲区接收到字符串保存到Receivebuffer ;;;;;;;;;;;;;;;;;;数组中,当遇到回车键时将该数组中的字符串通过串口发送出去
MOV
BYTE PTR[DI],AL ;将接收到的字符保存到存储区 INC DI
MOV
BYTE PTR[SI],AL ;将接收到的字符保存到发送缓冲区 INC SI CMP AL,0DH ; 接收到的数据是回车键吗? JNZ B ; 不是,则转WAITSENDSTRING;但是只有JMP指令才能实现far_label跳转,所以 ;采用此迂回办法 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;BIOS中断此处还不能用,莫名其妙的出错 ;
MOV
AH,01H ;
MOV
AL,'A' ;
MOV
DX,0 ;
INT
14H ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 是,开始发送 ;由于在sendbuffer帧头加Receive字样,发送会出错,也只能采取这种迂回的办法了
MOV
AL,00001010B ;;要使接收端换行使用回车键不行,使用LF换行
MOV
DX,3F8H ; 串口发送数据端口地址 OUT DX,AL ; 把该字符发送到输出数据缓冲器
MOV
AL,01010010B ;;R键
MOV
DX,3F8H ; 串口发送数据端口地址 OUT DX,AL ; 把该字符发送到输出数据缓冲器
MOV
AL,01100101B ;;e键
MOV
DX,3F8H ; 串口发送数据端口地址 OUT DX,AL ; 把该字符发送到输出数据缓冲器
MOV
AL,01100011B ;;c键
MOV
DX,3F8H ; 串口发送数据端口地址 OUT DX,AL ; 把该字符发送到输出数据缓冲器
MOV
AL,00111010B ;;回车键
MOV
DX,3F8H ; 串口发送数据端口地址 OUT DX,AL ; 把该字符发送到输出数据缓冲器
MOV
AL,00001010B ;;
MOV
DX,3F8H ; 串口发送数据端口地址 OUT DX,AL ; 把该字符发送到输出数据缓冲器
MOV
SI,OFFSET SENDBUFFER ;恢复 SI初始值 SEND:
MOV
AL,BYTE PTR[SI] INC SI
MOV
DX,3F8H ; 串口发送数据端口地址 OUT DX,AL ; 把该字符发送到输出数据缓冲器 CMP AL,0DH ; 接收到的数据是回车键吗? JNZ SEND ; 不是,则转SEND,继续发送
MOV
SI,OFFSET SENDBUFFER ;一次发送结束后,重新置位si
MOV
DL,0AH ; 换行
MOV
AH,02H
INT
21H
JMP WAITSENDSTRING ;发送完,重新开始接收 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;接收中断处理
程序
REC
INT
ERRUPT: CLI
MOV
AX
, CS ;
MOV
DS ,
AX
; PUSH BX PUSH
AX
; 暂存数据 PUSH DX
MOV
AH,41 ;
MOV
DL,AL ; DL =输出字符的ASCII码
INT
21H
;
MOV
DX,3F8H ; 端口接收数据端口地址 IN AL,DX ; 读取数据 AND AL,7FH ; 有效数据位为7位
MOV
AH,02H ; 向标准输出外设(如显示器)输出单个字符
MOV
DL,AL ; DL =输出字符的ASCII码
INT
21H
; CMP AL,0AH ; 接收到的数据是回车键吗? JNZ L2 ; 不是,则转L2
MOV
DL,0AH ; 是,输出换行符换行
MOV
AH,02H
INT
21H
L2:
MOV
AL ,
20H
;发中断结束命令(EOI) OUT
20H
, AL ; POP DX ; POP
AX
POP BX STI ;CPU开中断 IRET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
退出
程序
EXIT: ;保存处理
MOV
AH,02H ;
MOV
DL,01010011B ; DL =输出字符的ASCII S
INT
21H
;
MOV
AH,02H ;
MOV
DL,01100001B ; DL =输出字符的ASCII a
INT
21H
;
MOV
AH,02H ;
MOV
DL,01110110B ; DL =输出字符的ASCII码 v
INT
21H
;
MOV
AH,02H ;
MOV
DL,01100101B ; DL =输出字符的ASCII码 e
INT
21H
;
MOV
AH,02H ;
MOV
DL,00111111B ; DL =输出字符的ASCII码 ?
INT
21H
;
MOV
AH,02H ;
MOV
DL,01011001B ; DL =输出字符的ASCII码 Y
INT
21H
;
MOV
AH,02H ;
MOV
DL,00H ; DL =输出字符的ASCII码
INT
21H
;
MOV
AH,02H ;
MOV
DL,01001111B ; DL =输出字符的ASCII码 o
INT
21H
;
MOV
AH,02H ;
MOV
DL,01010010B ; DL =输出字符的ASCII码 r
INT
21H
;
MOV
AH,02H ;
MOV
DL,00H ; DL =输出字符的ASCII码
INT
21H
;
MOV
AH,02H ;
MOV
DL,01001110B ; DL =输出字符的ASCII码 n
INT
21H
; WAITSAVE:
MOV
AH,1 ; 键盘缓冲区是否有字符?
INT
16H ; JZ WAITSAVE ; 无,继续查询
MOV
AH,0 ;从键盘缓冲区取字符到AL ,当读了之后,缓冲区清空;不然,键盘缓冲去一直有数据
INT
16H ; CMP AL,01011001B ; 接收到的数据是Y键吗? JNZ EXITNOW ; 不是,则转OK JMP SAVE ;
退出
处理 EXITNOW:
MOV
AH , 25H ;
MOV
AL , 0CH ; POP ES ; POP BX ;
INT
21H
;恢复中断矢量表中0CH号中断服务
程序
的原地址。
MOV
AH ,
4CH
;
INT
21H
;返回DOS SAVE: ;
MOV
AX
, DATA ;
MOV
DS ,
AX
MOV
DX , OFFSET FILE
MOV
CX , 0
MOV
AH , 3CH
INT
21H
;创建文件,若磁盘上原有此文件,则覆盖 JC ERROR ;创建出错,转error处
MOV
HANDLE ,
AX
;保存文件号
MOV
BX ,
AX
MOV
BP , OFFSET MEMORYBUFFER SUB DI,BP
MOV
CX ,DI
MOV
DX , OFFSET MEMORYBUFFER ;用于计算发送的数目 ,同时是存储的原址
MOV
AH , 40H
INT
21H
;向文件中写入16个字节内容 JC ERROR ;写出错,转error处
MOV
DL,AH
MOV
AH,02H
INT
21H
MOV
DL,AL
MOV
AH,02H
INT
21H
MOV
BX , HANDLE
MOV
AH , 3EH
INT
21H
;关闭文件 JC ERROR ;关闭文件出错,转error处
MOV
DX , OFFSET MESSAGE
MOV
AH , 9
INT
21H
;操作成功后显示提示 JMP END1 ERROR:
MOV
DX , OFFSET ERROR_MESSAGE
MOV
AH , 9
INT
21H
;显示错误提示` END1:
MOV
AH ,
4CH
INT
21H
JMP EXITNOW CODE ENDS ; END START
汇编实现字母大小写转换和排序
程序
汇编设计,接口设计用到的,可以运行,和大家分享下
中断服务
程序
设计实验
中断服务
程序
设计实验 2.7.1 实验目的 1、 熟悉中断的概念、中断响应过程、中断向量表以及系统是如何根据中断类型号在中断向量表中得到该中断对应的中断服务
程序
的入口地址等内容。 2、 掌握中断服务
程序
的设计方法。 2.7.2 实验预习要求 1、 复习中断的有关内容。 2、 复习中断服务
程序
设计方法。 3、 读懂“2.7.4 实验内容”中给出的源
程序
,以便上机调试。 4、 从“2.7.5 实验习题”中任选一道题目,编写源
程序
,以便上机调试。 2.7.3 中断服务
程序
设计方法简介 由2.6节中的中断向量表可以看出,PC中断系统中中断类型可分为三类: 磁盘操作系统DOS提供的中断服务
程序
,中断类型号从
20H
到2FH; 系统主板BIOS芯片提供的BIOS中断服务
程序
,包括系统内部中断,中断类型号从00H到07H;系统8级外部中断,中断类型号从08H到0FH,它们对应于接在可编程中断控制器8259A的8个中断请求输入端IR0IR7的8个外部中断,其中IR2(中断类型号0AH)为系统保留,用户可通过该引脚实现对用户所需的外部硬件中断的管理;设备驱动
程序
,中断类型号从10H到1FH等; 用户定义的中断,中断类型号从60H到7FH、F1H到FFH。用户可根据实际需要将某些通用性强的子
程序
功能通过中断服务
程序
来实现。一旦设置好了这样的中断服务
程序
,在其他应用
程序
中就可以调用这些中断服务
程序
。 设计中断服务
程序
的步骤如下: 1、 选择一个中断类型号 如果采用硬件中断,则要使用硬件决定的中断类型号。在PC机系统中,使用了一片可编程中断控制器8259A来对外部硬件中断进行管理,具体内容参见教材264页“8259A应用举例”,可以看出IR2为系统保留,其中断类型号为0AH。若用户需要,可将用户所需的外部中断源发来的中断请求信号接到IR2,编写该中断所需的中断服务
程序
,并将该中断服务
程序
的入口地址写到中断向量表0AH4AH4+3四个单元中,这样,当接在IR2上的外部中断源发来中断请求信号时,系统就会根据得到的类型号(0AH)到中断向量表中找出其入口地址,并转去执行该中断服务
程序
。 如果采用软件中断,即利用执行
int
n指令的方式执行中断服务
程序
,则可从系统预留给用户的中断类型号60H7FH、F1HFFH中选择一个。 2、 将中断服务
程序
的入口地址置入中断向量表的相应的四个存储单元中 确定了中断类型号,还要把中断服务
程序
入口地址置入中断向量表,以保证在中断响应时CPU能自动转入与该类型号相对应的中断服务
程序
。下面介绍
两种
将中断服务
程序
入口地址置入中断向量表的方法。 (1) 直接装入法 用传送指令直接将中断服务
程序
首地址置入矢量表中。设中断类型号为60H(此类型号对应的矢量表地址为从00180H开始的四个连续存储单元)。 PUSH DS XOR
AX
,
AX
MOV
DS,
AX
;将数据段寄存器清零
MOV
AX
,OFFSET
INT
60 ;将中断服务
程序
INT
60所在段内的偏移地址送
AX
MOV
DS:[0180H],
AX
;将中断服务
程序
偏移地址送中断向量表00180H和00181单元
MOV
AX
,SEG
INT
60 ;将中断服务
程序
INT
60所在段的段地址送
AX
MOV
DS:[0180H+2],
AX
;将中断服务
程序
所在代码段的段地址送00182H和00183单元 POP DS (2) DOS系统功能调用法 功能号(AH)=25H; 入口参数:(AL)=中断类型号, (DS)=中断服务
程序
入口地址的段地址 (DX)=中断服务
程序
入口地址的偏移地址 下面
程序
段完成中断类型号为60H的入口地址置入。 PUSH DS ;保护DS
MOV
DX,OFFSET
INT
60 ;取服务
程序
偏移地址
MOV
AX
,SEG
INT
60 ;取服务
程序
段地址
MOV
DS,
AX
MOV
AH,25H ;送功能号
MOV
AL,60H ;送中断类型号
INT
21H
;DOS功能调用 POP DS ;恢复DS 3、 使中断服务
程序
驻留内存,以便其他应用
程序
调用 实现这一步骤的必要性在于:一旦中断服务
程序
驻留内存后,一般
程序
员使用这一新增的中断调用就如同调用DOS或BIOS的中断子
程序
一样,只要了解其入口要求和返回参数就可调用。
程序
驻留在内存后,它占用的存储区就不会被其他软件覆盖。使
程序
驻留内存,要求该
程序
以 .COM形式运行,这种种结构的
程序
要求入口定位于100H,并且数据和代码均在同一个段内,这样,.COM
程序
就被定位于低地址区,DOS常在低地址区增加驻留
程序
,而 .EXE
程序
被定位于高地
基础汇编
程序
(7)排序实验
从数据段指定地址1000H开始存放50个数,设计
程序
将这些数由小到大排序,排序后的数,仍放在原存储区,并回显排序结果
汇编语言
21,494
社区成员
41,618
社区内容
发帖
与我相关
我的任务
汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
复制链接
扫一扫
分享
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章