关键词不能为空

当前您在: 主页 > 高中公式大全 >

绝的组词:利用模块结构编程:从键盘上输入一个二位十进制的月份(01~12),然后显示相应月份的英文缩写名。

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2020-12-03 12:47
tags:英文月份缩写

土地平旷-新计生专

2020年12月3日发(作者:鞠常)
利用模块结构编程:从键盘上输入一个二位十进制的月份(01~12),然后显示相应月份的
英文缩写名。
;主模块:键盘接受一个二位十进制数,并换成二进制数;
;子模块:有两个子程序构成:
;(1) 依输入月份数查英文缩写月份名表;
;(2) 显示查到的月份的英文缩写名。 ;这个函数里边我只设置了两个子函数,有些功能根
本不必用子函数的形式来写
.386
STACK SEGMENT USE16 STACK
DB 200 DUP(0)
STACK ENDS
DATA SEGMENT USE16
SIGN DB ?
IPT DB 10
DB ?
DB 10 DUP(0) 用户输入,为ASCII形式,故需转换,以后将 调用F10T2子函数
PRT DB 'PLEASE INPUT MONTH NUMBER IN DECIMAL:$$';提示用户输入
ERRMSG DB 'INPUT FORMAT ERROR$$' 输入不合法
DSP DB 'THE MONTH YOU INPUTTED IN DECIMAL IS IN ENGLISH!$$' ;显示提示,用
来显示结果
这里有几个空格,用来显示月份英文名
JAN DB ' JAN'
FEB DB ' FEB'
MAR DB ' MAR'
APR DB ' APR'
MAY DB ' MAY'
JUN DB ' JUN'
JULY DB 'JULY'
AUG DB ' AUG'
SEP DB ' SEP'
OCT DB ' OCT'
NOV DB ' NOV'
_DEC DB '_DEC' ;DEC与现有指令冲突,你可以想办法替换到那个下划线
CRLF DB 0DH,0AH,'$$' ;回车换行符
DATA ENDS

CODE SEGMENT USE16
ASSUME CS: CODE,DS: DATA,SS: STACK
DS_STR MACRO BUF 显示字符串的宏
LEA DX,BUF
MOV AH,9
INT 21H
ENDM
START:
MOV AX,DATA
MOV DS,AX

DS_STR PRT
DS_STR CRLF 显示提示信息

LEA DX,IPT
MOV AH,10
INT 21H 接受用户输入

MOV SI,OFFSET IPT
ADD SI,2
MOV CL,BYTE PTR [SI-1]
MOV CH,0
CMP CX,2
JNZ ERR_IPT 用户输入长度不合要求,例如输入了三位数
MOV DX,16 设置调用F10T2的入口参数

CALL F10T2 转换后的结果被放在AX中

MOV DX,AX 设置查找函数的入口参数

CALL QUERY 查找月份修改即将显示的字符串

DS_STR DSP

EXIT:
MOV AH,4CH
INT 21H


ERR_IPT:
DS_STR CRLF
DS_STR ERRMSG
JMP EXIT

;功能:查找月份
;入口参数:DX--- 存放要查找的月份的二进制数的表示
;出口参数:无
QUERY PROC
CMP DX,01
JB ERR_IPT
CMP DX,12
JA ERR_IPT 输入错误

MOV SI,OFFSET DSP
ADD SI,37 ;定位到显示字符串的英文月份处,准备写入东西
MOV DI,OFFSET JAN

DEC DX
MOV AX,DX
MOV BL,4
MUL BL ;MUL指令不允许OPS为立即数,即不能用 MUL 4
ADD DI,AX ;计算机应当输出的月份

MOV CX,4 ;设置循环次数

LOP:
MOV AL,BYTE PTR [DI]
MOV BYTE PTR [SI],AL ;注意不能直接写成MOV BYTE PTR [SI],BYTE PTR [DI]
;双操作指令不允许两个操作数寻址方式都为存储器方式
INC SI
INC DI
LOOP LOP

RET
QUERY ENDP
;功能:将十进制的ASC2码转换为有符号二进制数->A XEAX,如果该数溢出或非法,则-1->SI.
其中,
;可转换的16位有符号数范围- 32767~+32767,32位有符号数的范围是
-2147483647~+214748364 7
;入口参数:SI---指向待转换的十进制ASC2码存储区首址
; CX---存放该十进制的ASC2码串的长度
; DX--- 存放16位或32位标志
;出口参数:转换后的二进制数--->AXEAX.如果是非法数或溢出,则-1--->SI
; 所用寄存器和变量为:
; EBX---中间寄存器
; SIGN---正负数标记,见前边DATA SEGMENT
F10T2 PROC
PUSH EBX
MOV EAX,0
MOV SIGN,0
MOV BL,[SI] 取一字符-->BL
CMP BL,'+'
JE F10
CMP BL,'-'
JNE NEXT2
MOV SIGN,1 ;如果(BL)为'-'号,1--->SIGN
F10:
DEC CX 数字串长度减1
JZ ERR ;如果长度为0转错误处理
NEXT1:
INC SI
MOV BL,[SI]
NEXT2:
CMP BL,'0'
JB ERR
CMP BL,'9'
JA ERR
SUB BL,30H
MOVZX EBX,BL
IMUL EAX,10
JO ERR
ADD EAX,EBX ;计算(EAX)*10+EBX->EAX
JO ERR
JS ERR
JC ERR
DEC CX
JNZ NEXT1
CMP DX,16
JNE PP0
CMP EAX,7FFFH 转换的结果是否超过16位
JA ERR
PP0:
CMP SIGN,1
JNE QQ 是负数,应对(EAX)求补才是负数的补码表示
NEG EAX
QQ:
POP EBX
RET
ERR:
MOV SI,-1
JMP QQ
F10T2 ENDP
CODE ENDS
END START
data segment
disp DB 0dh,0ah,'Input month: $$'

DISP_ERR DB ' INPUT ERR!$$'
bye db 0dh,0ah,'Bye!$$'

tab DB ' JAN $$ FEB $$ MAR $$ APR $$ MAY $$ JUN $$ JULY$$ AUG $$ SEP
$$ OCT $$ NOV $$ DEC $$'
num db 0

data ends
code segment
main proc far
assume cs:code
start:
push ds
mov ax,0
push ax
mov ax,data
mov ds,ax

call c12m_e

mov ah,09
mov dx,offset bye
int 21h


ret
main endp

;=====================
c12m_e proc near
AGAIN:
mov al,0
mov num,al

lea dx,disp
mov ah,9
int 21h


re_in:
mov ah,08
int 21h
CMP AL,'Q'
JE ENDD
CMP AL,'q'
JE ENDD

cmp al,0dh
JE IN_DOWN

cmp al,'0'
jb re_in
cmp al,'9'
ja re_in
push ax

mov dl,al
mov ah,02
int 21h

mov ah,0
mov al,num
mov bl,10
mul bl
pop bx
SUB BL,30H
add al,bl ;月份
MOV NUM,AL
Jmp RE_IN
IN_DOWN:
MOV AL,NUM
CMP AL,12
JA ERR
CMP AL,1
JB ERR
DEC AL
MOV BL,7 ;tab中每月占用的字节数
MUL BL
MOV DX,OFFSET TAB
MOV AH,0
ADD DX,AX
MOV AH,09
INT 21H

MOV AX,0E07H
INT 10H

JMP AGAIN

ERR:
MOV DX,OFFSET DISP_ERR
MOV AH,09
INT 21H
JMP AGAIN


ENDD:
mov ah,2
mov dl,al
int 21h
ret
c12m_e endp

;=============
code ends
end start

华中理工大学排名-桂林七日游


塞上江南指的是什么地方-广东省有哪些大学


平行四边形特性是什么-举世无双的珍品


江西大学排名-唯美意境头像


高考时间是几月几号-翻绳


王源的微信-风雨同舟造句


海南高考作文-汽车驾驶技术培训


中南大学录取分数线-信任英文



本文更新与2020-12-03 12:47,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/476854.html

利用模块结构编程:从键盘上输入一个二位十进制的月份(01~12),然后显示相应月份的英文缩写名。的相关文章

利用模块结构编程:从键盘上输入一个二位十进制的月份(01~12),然后显示相应月份的英文缩写名。随机文章