4.8086汇编语言3
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CODE SEGMENT ASSUME CS:CODE START: MOV AX,1234H MOV CX,16 AA1: SHL AX,1 RCR BX, 1 LOOP AA1 MOV AX,4C00H INT 21H CODE ENDS END START
3.代码转换例题 【例4.8】编程将以$结束的字符串中的小写字母改为大写字母。 DATA SEGMENT SUB AL,20H STR DB ‘heLLo,eveRyboDY!’,’$’ ;将小写字母改为大写字母 DATA ENDS MOV [BX], AL CODE SEGMENT NEXT: INC BX ASSUME CS:CODE,DS:DATA JMP A1 START:MOV AX,DATA DONE: MOV AX, 4C00H MOV DS, AX INT 21H LEA BX, STR CODE ENDS A1: MOV AL, [BX] END START CMP AL, ’$’ ;是$符,则结束 JE DONE CMP AL ,’a’ JB NEXT ;低于,则为大写字母 CMP AL, ’z’ JA NEXT ;高于,则不是字母
;在数据段定义要显示的字符串
... mov ah,09h
;设置功能号:ah←09h
mov dx,offset string
;提供入口参数:dx←字符串的偏移地址
int
21h
;DOS功能调用:显示
子程序设计
【例4-18】编写一个子程序,完成一个2位十六进制数到ASCII码的转换。
SHR AH,CL CODE SEGMENT CMP AH,0AH ASSUME CS:CODE JB ASC2 CONHA PROC FAR ADD AH,07 MOV AH,AL ;保存待转换的数 ASC2: AND AL,0FH ;处理十六进制数低位 ADD AH,30H CMP AL,0AH;是十六进制数中的字母吗? MOV BH,AH JB ASC1 ;否,转移 RET ADD AL,07 ;是,先加7 CONHA ENDP CODE ENDS
MOV AX,4B6CH
MOV CX,0 MOV BX,10
;统计除法次数
【例4-13】将BLOCK内存区的带符号字节型数据按正数、负数分 开,并分别存入BUFF1和BUFF2中。(P120) DATA SEGMENT LOP: LODSB BLOCK DB 60 DUP(?) TEST AL,80H BUFF1 DB 60 DUP(?) JNZ FU ;负数 BUFF2 DB 60 DUP(?) STOSB ;否则,存入正数区 DATA ENDS JMP AGAIN CODE SEGMENT ASSUME CS:CODE,DS:DATA FU: XCHG BX,DI ; 交换目的地址 STOSB START:MOV AX, DATA XCHG BX,DI ;还原目的地址 MOV DS,AX AGAIN:LOOP LOP MOV ES,AX MOV AX,4C00H LEA SI, BLOCK ;数据区 INT 21H LEA DI, BUFF1 ;正数缓冲区 LEA BX,BUFF2;负数缓冲区 CODE ENDS END START MOV CX,60 CLD
mov ah,02h
mov dl,'?'
;设置功能号:ah←02h
;提供入口参数:dl←'?'
int 21h
;DOS功能调用:显示
【例4-16】从键盘输入两个一位十进制数,求两数之 和且在屏幕上显示结果。 MOV DL,AL CODE SEGMENT ADD DL,30H ASSUME CS:CODE MOV AH,2 START: INT 21H MOV AH,1 CODE ENDS INT 21H END START
(4)屏幕显示字符串
DOS功能调用INT 21H 功能号:AH=09H 入口参数:DS:DX=欲显示字符串在主存中的首 地址 功能:在显示器输出指定的字符串 字符串应以$(24H)结束 可以输出回车(0DH)和换行(0AH)字符产生 回车和换行的作用
例:显示字符串
string db 'Hello,Everybody !',0dh,0ah,'$'
yeskey:
nokey:
...
...
(2)屏幕显示一个字符
DOS功能调用INT 21H 功能号:AH=02H
入口参数DL=字符的ASCII码
功能:在显示器当前光标位置显示给定的 字符,光标右移一个字符位置。如按CtrlBreak或Ctrl-C则退出
例:显示问号
;在当前显示器光标位置显示一个问号
4.6
4.6.1
汇编语言程序设计与上机调试
汇编语言程序设计实例
前面介绍了编写汇编语言程序所需要掌握的基本知识,
如基本语句、格式,以及如何用伪指令定义变量。常数和定
义程序段等,也根据内容需要给出了简单例题。下面要从问 题入手,设计汇编语言程序,编写一个汇编语言程序的框架。 由于汇编语言精练、简洁、快速、面向机器编程,特别 适合要求执行速度快的场合,尤其是对输入/输出设备的控 制,其效率是一般高级语言无法比拟的。
6. 按数据大小排序 P110 【例4-14】编程实现,从一串带符号字型数据中找出最大值。 负数 DATA SEGMENT ’ BLOCK DW 762EH,6A8BH,-664AH,0B945H,-85DH COUNT EQU ($-BLOCK)/2 AA1: ADD SI, 2 DATA ENDS CMP AX, [SI] CODE SEGMENT JG AA2 ASSUME CS:CODE,DS:DATA MOV AX,[SI] START: MOV AX,DATA AA2: LOOP AA1 MOV DS,AX MOV BX, AX LEA SI,BLOCK MOV AX, 4C00H MOV CX, COUNT INT 21H MOV AX, [SI];取第1个数 CODE ENDS DEC CX ;准备与下个数比较 END START
MOV MOV INT ADD AAA
BL,AL AH,1 21H AL,BL
(3)从键盘输入一串字符
DOS功能调用INT 21H
功能号:AH=0AH
入口参数:DS:DX=缓冲区首地址
执行该功能调用时,用户按键,最后用回车确认。
本调用可执行全部标准键盘编辑命令;用户按回车 键结束输入,如按Ctrl+Break或Ctrl+C则中止。
功能:获得按键的ASCII代码值
调用此功能时,若无键按下,则会一直等待, 直到按键后才读取该键值
例:判断按键
getkey: mov ah,01h int je je jne ... 21h yeskey nokey getkey cmp al,’Y’ cmp al,’N’ ;是“N” ;功能号:ah←01h ;功能调用 ;处理出口参数al ;是“Y”
2.逻辑处理题
【例4.6】将寄存器AL中高、低4位交换。
CODE SEGMENT
ASSUME CS:CODE START:MOV AL,0ABH
MOV CL,4
ROL AL,CL MOV AX,4C00H
;移出位补充移空位4次
INT
CODE ENDS END
21 H
START
【例4.7】将AX中的内容按相反顺序存入BX中。
1.算术运算例题 【例4-4】在偏移首地址为ARRAY的内存储区有100个字型数 据,要求将数组的每个元素加1。 DATA SEGMENT ARRAY DW 100 DUP(?) ;定义1 00个字型随机数 DATA EDNS CODE SEGMENT ASSUME DS:DATA,CS:CODE START: MOV AX,DATA MOV DS,AX LEA BX,ARRAY ;设数组首地址指针 MOV CX,LENGTH ARRAY ;数组数据长度 AA1: INC WORD PTR[BX],1 ;指定为字型数加1 ADD BX,2 ;移动地址指针 LOOP AA1 ;循环操作 MOV AX,4C00H INT 21H CODE ENDS END START
例:输入字符串
buffer db 81 ;定义缓冲区第,1个字节填入可能输入的最大字符数 db 0 ;存放实际输入的字符数 db 81 dup(0) ;存放输入的字符串 ... mov ax,seg buffer ;伪指令seg取得buffer的段地址 mov ds,ax ;设置数据段DS mov dx,offset buffer mov ah,0ah int 21h
【例4-9】十六进制(二进制)数到十进制的转换
SST SEGMENT PARA STACK ’STACK’ TOP DW 50 DUP(?) SST ENDS CODE SEGMENT ASSUME CS:CODE,SS:SST START: MOV AX,SST MOV SS,AX ;设置堆栈段 A1:MOV DX,0 ;被除数扩展为32位 DIV BX PUSH DX ;将转换好的数存入堆栈 INC CX OR AX,AX ;转换直到商为0 JNZ A1 MOV AX,4C00H INT 21 H CODE ENDS END START
子程序还包含将二进制数转换为asci显示时负数用摚瓟引导正数直接输出没有前导字符子程序的入口参数用共享变量传递主程序调用该子程序显示10个数据createpdfyouwishlineclickherebuyvirtualpdfprinter万位100000000余数1000000余数10000余数10百位十位个位createpdfyouwishlineclickherebuyvirtualpdfprinter主程序binasc子程序把二进制数转换成十进制数在屏幕上显示dpcrlf子程序回车换行chang子程序转换一位十进制数createpdfyouwishlineclickherebuyvirtualpdfprinter主程序cx数据个数bx数据区首址x取一个数据调用binasc调用dpcrlf处理完否
4.6.2
DOS功能调用
21H号中断是DOS提供给用户的用于调用系统功能的
中断,它有近百个功能供用户选择使用,主要包括设备管 理、目录管理和文件管理三个方面的功能。
汇编语言程的资源是程序设计的一个重要方
面,需要掌握。
功能调用的格式
通常按照如下4个步骤进行:
【例4-1 5】编程实现,将一个带符号字节型数据组中的数据按从 大到小的顺序排列。 LOP1: MOV DX,CX ;保存循环次数 比 较 遍 数 序号 MOV SI,0 ;采用变址寻址 1 2 3 4 5 1 13 13 96 96 96 96 LOP2: MOV AL,BUFF[SI] 2 -39 96 84 84 84 84 CMP AL,BUFF[SI+1];前数与后数比较 3 96 84 13 58 58 58 JGE COT ;前一个数大(或相等)转 4 84 -39 58 13 13 13 5 -75 58 -39 -39 -39 -39 XCHG AL,BUFF[SI+1];否则交换内存位置 6 58 -75 -75 -75 -75 -75 MOV BUFF[SI],AL DATA SEGMENT COT: INC SI BUFF DB 13,-39,96,84,-75,58 LOOP LOP2;所有数据排列一次 COUNT EQU $-BUFF MOV CX,DX ;开始下一次排序 DATA ENDS LOOP LOP1 CODE SEGMENT MOV AX,4C00H 冒泡法 ASSUME CS:CODE,DS:DATA INT 21H START: MOV AX,DATA CODE ENDS MOV DS,AX END START MOV CX,COUNT-1
【例4-5】有两个无符号字节型数组,设数组元素个数相等,编 程将数组中的对应元素相加,结果存入另一内存区。 DATA SEGM[ENT AA1: MOV AL,[SI] M1 DB 20 DUP(?) ADD AL,[DI] M2 DB 20 DUP(?) MOV [BX],AL M3 DW 20 DUP(0) ADC BYTE PTR[BX+1],0 DATA ENDS ;存结果的进位 CODE SEGMENT INC SI ASSUME CS:CODE,DS:DATA INC DI START:MOV AX,DATA ADD BX,2 MOV DS,AX LOOP AA1 LEA SI,M1;设数组1的地址指针 MOV AX,4C00H LEA DI,M2;设数组2的地址指针 INT 21 H LEA BX,M3 ;设结果区的地址指针 CODE ENDS MOV CX,20 END START
⑴ 在AH寄存器中设置系统功能调用号 ⑵ 在指定寄存器中设置入口参数 ⑶ 执行指令INT 21H(或ROM-BIOS的中断向量号)实 现中断服务程序的功能调用
⑷ 根据出口参数分析功能调用执行情况
(1)从键盘输入单个字符
DOS功能调用INT 21H
功能号:AH=01H
出口参数:(AL)=字符的ASCII码