前言
作为一名在校大学生,我将近期所学的知识进行总结。
一年之后我再看这些代码,我发现这些代码对于初学者十分友好。因此,我将这些代码分享给大家,希望大家能有所收获。如有不足,欢迎交流。
推荐可以看这位B站up主的视频学习汇编
B站up主
提示:以下是本篇文章正文内容,下面案例可供参考
一、利用DOS调用实现简单的加法
2.1题目要求
(1)输出提示信息“Please input A” (功能号09H)
(2)利用 01H功能,获取输入 A
(3)对输入A进行处理实现ASCII码到数值的转换
(4)输出提示信息“Please input B”
(5)利用 01H功能,获取输入 B
(6)对输入B进行处理实现ASCII码到数值的转换
(7)计算A+B并实现十六进制数到BCD码的转换
(8)将BCD码转换为ASCII码,并利用02H功能进行显示
2.1程序代码和运行结果
2.1代码如下(示例):
; multi-segment executable file template.
data segment
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TIPS1 DB 'Please input A',0DH,0AH,'$' ;TIPS(提示信息)
;ODH 回车 ;0AH换行
TIPS2 DB 'Please input B',0DH,0AH,'$'
TIPS3 DB 'RESULT IS',0DH,0AH,'$'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ends
code segment
start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;数据A的输入
MOV DX,OFFSET TIPS1
MOV AH,09H ;利用09H的功能,将提示信息显示出来
INT 21H
MOV AH,01H ;利用01H的功能,读取一个字符
INT 21H
AND AL,0FH ;因为它是一个ascall值,所以将高四位屏蔽,只保留低四位
MOV BL,AL ;将数据暂存放到 BL 当中
;数据B的输入
MOV DL,0DH ;回车
MOV AH,02H
INT 21H
MOV DL,0AH ;换行
MOV AH,09H
INT 21H
MOV DX,OFFSET TIPS2
MOV AH,09H ;利用09H的功能,将提示信息显示出来
INT 21H
MOV AH,01H ;利用01H的功能,读取一个字符
INT 21H
AND AL,0FH ;因为它是一个ascall值,所以将高四位屏蔽,只保留低四位 数据暂存放到 AL 当中
ADD AL,BL ;A+B
MOV AH,00H ;AH清0
AAA ;将计算结果换为非压缩的BCD码的形式
ADD AX,3030H ;将数据转化为ASCALL码
MOV BX,AX ;将数据暂存放到BX
;结果显示
MOV DL,0DH ;回车
MOV AH,02H
INT 21H
MOV DL,0AH ;换行
MOV AH,09H
INT 21H
MOV DX,OFFSET TIPS3 ;提示信息
MOV AH,09H
INT 21H
MOV DL,BH
MOV AH,02H
INT 21H
MOV DL,BL
MOV AH,02H
INT 21H
;退出DOS
MOV AH,4CH
INT 21H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov ax, 4c00h ; exit to operating system.
int 21h
ends
end start ; set entry point and stop the assembler.
2.1运行结果
二、求某数据区内负数的个数
2.2题目要求
设数据区的BUF中存放着N+1个单字节数据,第一个字节存放数据长度N。从第二个字节开始依次存放着N个数据。设计程序根据数据最高位是否为1,统计N个数据中有多少个负数,将结果存放在RESULT单元中。
2.2程序代码和运行结果
2.2代码如下(示例):
; multi-segment executable file template.
data segment
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BUF DB 10 ;定义了10个数字
DB 2,3,6,-45,-78,-9,3,5,-10,9 ;10个数分别是
result DB 0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ends
code segment
start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV SI,OFFSET BUF ;将BUF首地址送给SI
MOV CH,00H ;题目要求,第一个数是指循环的次数,因此应该放到CX寄存器中
MOV CL,[SI] ;但是CX是一个字,BUF是一个字节,会被转化为字在给CX赋值
INC SI ; SI++
MOV BL,00H ;BL清0
xh:MOV AL,[SI]
CMP AL,80H ;判断AL里面值的大小
JB zhengshu ;小于80H说明是正数,不用操作
INC BL ;BL用于统计负数的个数。因此BL++
zhengshu:INC SI ;正数的,SI的地址++
LOOP xh
MOV result,BL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov ax, 4c00h ; exit to operating system.
int 21h
ends
end start ; set entry point and stop the assembler.
2.2运行结果
三、编写一个循环结构的程序
2.3题目要求
请编写一个循环结构的程序,通过使用02H号功能调用,依次在屏幕上显示26个英文字母的大写形式。并且在显示字符之间加入空格
2.3程序代码和运行结果
2.3代码如下(示例):
; multi-segment executable file template.
data segment
; add your data here!
pkey db "press any key...$"
ends
code segment
start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV CX,26 ;控制循环次数
MOV BL,00H ;让字母变换的变量
xh:
MOV DL,'A'
ADD DL,BL
MOV AH,02H
INT 21H
INC BL ;将BL加1,使其显示字母发生改变
MOV DL,' ' ;使显示的字母中间有空格
MOV AH,02H
INT 21H
LOOP xh
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov ax, 4c00h ; exit to operating system.
int 21h
ends
end start ; set entry point and stop the assembler.
2.3运行结果
四、由键盘输入一个字母的小写形式,将其变换为大写形式输出。
2.4题目要求
(1)将程序设计为一个循环结构可以不停的对输入字符进行转换
(2)设置一个终止字符‘#’当输入时可以停止转换
(3)可以对输入数据的格式进行判断如果不是小写字母,则重新输入
2.4程序代码和运行结果
2.4代码如下(示例):文章来源:https://www.toymoban.com/news/detail-769898.html
DATA SEGMENT ;数据段
MESS DB 0DH,0AH,'PLEASE INPUT A LETTER',0DH,0AH,'$'
DATA ENDS
EXTRA SEGMENT ; ;附加段
EXTRA ENDS
;
STACK SEGMENT PARA STACK ‘STACK’ ;堆栈段
STAPN DB 100 DUP (00H) ;定义100字节空间
TOP EQU LENGTH STAPN
STACK ENDS
CODE SEGMENT
MAIN PROC FAR ;过程定义语句
;说明4个段寄存器分别与哪些段有关
ASSUME CS:CODE, DS:DATA,ES:EXTRA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV AX, EXTRA
MOV ES,AX
MOV AX,STACK
MOV SS,AX
M_START : MOV DX,OFFSET MESS
MOV AH,09H
INT 21H
MOV AH,01H
INT 21H
CMP AL,'#'
JE M_OUT
CMP AL,'a'
JB M_START
CMP AL,'z'
JA M_START
SUB AL,20H
MOV DL,AL
MOV AH,02H
INT 21H
JMP M_START
M_OUT: MOV AX,4C00H
INT 21H
RET
MAIN ENDP ;MAIN过程结束
CODE ENDS ;代码段结束
END MAIN ;整个源代码结束
2.4运行结果
文章来源地址https://www.toymoban.com/news/detail-769898.html
到了这里,关于微机实验第二章:循环、分支程序和常用的DOS功能调用(B站)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!