当前位置:文档之家› 336汇编语言程序举例

336汇编语言程序举例


• hexibin改成子程序。

• ERROR DB ‘ERROR!’,0DH,0AH,’$’

……..
• hexibin
PROC

XOR BX,BX
• NEWCHAR: MOV AH,KEY_IN

INT DOSCALL

SUB AL,30H

JB KKK

CMP AL,0AH

JB GETS

• 分析:
• BX=9625=[((0*10+9)*10+6)*10+2]*10+5
• 程序:
• DATA SEGMENT
• ASDEC DB 33H,39H,36H,32H,35H
• COUNT EQU $-ASDEC
• BIN
DW ?
• DATA ENDS
• CODE SEGMENT

ASSUME CS:CODE,DS:DATA
• 3)基本功能调用
• (1)键盘输入(1号调用)
• 功能:等待从键盘输入一字符。用CTRL-Break ( CTRL-C)停止运行,用TAB键,光标移动8个字 符位置。不需入口参数。
• 例:带显示的 MOV AH,01H

INT 21H
• 出口参数:字符的ASCII码在AL中。
• 例2:不带显示的一字符键盘输入。 • MOV AH,07H

ASSUME CS:CODE,DS:DATA
• START: MOV AX, DATA

MOV DS,AX

MOV SI,OFFSET ASHEX

MOV AL,[SI]

SUB AL,30H

CMP AL,0AH

JB NEXT1

SUB AL,7
• NEXT1: MOV CL,4

SAL AL,CL
• 高级文件系统接口,在DOS下运行的程
序可调用。
• 例:完成一个用户程序请求,输入输出时各关系 如下:
用户程序 高级DOS 低级DOS ROM
对I/O的 程序请求

BIOS
外设
注意:有些情况既能选DOS中断也可选择BIOS中断 来完成。尽量使用DOS,而BIOS更靠近硬件。

若ZF=0,AL=字符值

ZF=1,无键按下,AL中非字符值
• 当DL非FFH,向屏幕输出DL中的字符
• 例:从键盘输入字符。

MOV DL,0FFH

MOV AH,6

INT 21H
• (4)输出字符( 2号调用)
• 功能:显示一个字符。DL中是字符的ASCII码。
• 例:MOV DL,‘A’


INC DI

CMP BX,1

JNZ LOP1

MOV AH,4CH

INT 21H
• CODE ENDS
• 例4:将4字节的组合BCD码分为4个单字 节数相加,从低字节开始,进行4次循环操 作.
• 程序如下:
• DATA SEGMENT
• BCD1 DB 76H,54H,38H,29H
• BCD2 DB 49H,37H,65H,17H

MOV BL,AL;存高位

INC SI

MOV AL,[SI]

SUB AL,30H

CMP AL,0AH

JB NEXT2

SUB AL,7
• NEXT2:OR AL,BL;合并

MOV BIN,AL

MOV AH,4CH

INT 21H
• CODE ENDS

END START
• 例2: 编程实现,将ASCII码表示的5位 十进制数(<65535)转换成两字节二进 制数。
3.3.7 DOS系统功能调用和 ROM BIOS中断调用
• 1、DOS调用(磁盘操作系统调用) • 由软盘或硬盘提供的,比BIOS用起来更
方便,因提供了更多更必要的测试。且 对硬件依赖性更少。
• 中断类型号:20H~27H
1)功能:向用户提供各种操作命令和许多 系统功能调用。主要功能:
• (1)磁盘的读写、控制

MOV AX,BIN
• LOP1: XOR CL,CL

MOV BX,[SI]
• LOP2: SUB AX,BX

JB NEXT

INC CL

JMP LOP2
• NEXT: ADD AX,BX;不够减,恢复

ADD CL,30H ;转成ASCII码

MOV [DI],CL

INC SI

INC SI
例:打印机输出一个字符,可用DOS 21H的功能5 或BIOS 17H的功能0。
但有些DOS中断不能提供。如声音控制、某些状态 等。调用方法同前,但若需子功能号,还要送AL。
• 2)调用方法
• (1)入口参数送指定寄存器(需要时)
• (2)功能号送AH
• (3)INT 21H
• 结果是出口参数送指定寄存器。
CMP AL,11H

JB KKK

SUB AL,07H

CMP AL,0FH

JBE GETS

CMP AL,2AH

JB KKK

CMP AL,2FH

JA KKK

SUB AL,20H
• GETS: MOV CL,04H

SHL BX,CL
• • • • KKK: • • • • • • • hexibin

;保留,输入完填入
100 DUP(?)

MOV AX,DATA

MOV DS,AX

MOV DX,OFFSET BUF

MOV AH,0AH

INT 21H
• 当实际输入长度超过最大长度时,后边字符 略去且响铃,直到输入回车符。
• (7)日期设置(2BH调用)
• 功能:CX=年号(1980~2099)
3.3.6 汇编语言程序举例
• 例1:将ASCII码表示的两位16进制数转换 成一字节二进制数。
• 算法:41H,36H(A6H)1010 0110B, 一位位进行
• 程序: • DATA SEGMENT • ASHEX DB 41H,36H • BIN DB ? • DATA ENDS
• CODE SEGMENT
• INT 21H • (2)打印输出(5号调用) • 功能:把DL中的字符输出到打印机上。 • 例:MOV DL,‘A’ • MOV AH,5
• INT 21H • (3)直接控制台输入/输出(6号调用) • 功能:从标准输入设备输入字符,或向
屏幕上输出字符,但不检查CTRL-Break。
• 当DL=FFH时,表示从键盘输入
• 例:键盘I/O中断调用(16H),有三个功能,功能号 在AH中。
• (1)AH=0
• 功能:从键盘读入字符送AL
• 出口参数:AL=输入字符的ASCII码值
• 例:MOV AH,0
• 主程序:
• display equ 02H
• key_in equ 01H
• doscall equ 21H • crlf 宏指令定义同前。
• Main proc far

……
• main1 call hexibin

crlf

call binidec

crlf

jmp main1

ret
• main endp

MOV DS,AX

MOV DX,OFFSET BUF

MOV AH,09H

INT 21H

…...
• (6)字符串输入(0AH号调用) • 功能:从键盘 接收一串字符到输入缓冲区,但
应先建立一个缓冲区。
能保存的数
实际输入数
(返回时填入)
• 例:BUF DB

DB

DB

回车键
0D
100 ;最大长度

INC SI

INC BX

INC DI

DEC CL

JNZ AGAIN

MOV AX,4C00H

INT 21H
• CODE ENDS

END BCDADD
• 例5:编程实现,把从键盘输入的0~FFFFH的 十六进制正数转换为十进制数并从屏幕上显 示出来。
• 调用HEXIBIN和BINIDEC两个子程序。用 Ctrl Break退出。
• dec_div • • • • • • • • • • dec_div
proc mov ax,bx ;被除数放DX,AX mov dx,0 div cx mov bx,dx ;余数到BX mov dl,al ;显示商,而商<10 add dl,30h mov ah,display int doscall ret endp
• (2)内存管理、文件操作和目录操作
• (3)基本输入输出管理(如键盘、打印 机、显示器、磁盘等管理),还有时间、 日期等子程序。
• 需要时可直接调用84个功能子程序。
• DOS的两个主要模块 • (1)输入输出设备处理程序
相关主题