编程达人进,在线等汇编作业

设计一个程序,程序名为JXXYY8.ASM。该程序包括数据输入(输入十进制数1到12,)、查找对应的月份、月份的英文单词输出三个子程序。

这个问题麻烦的地方在于接受输入的月份,因为月份位数不等,带来处理上的繁琐。我图省事,把以前编的接收无符号数的子程序直接搬过来用了。至于确定对应月份的字符串地址及输出月份的英文单词,则很容易,不必编制独立的子程序。

; 本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。
Code Segment
Assume CS:Code,DS:Code
; -------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)

; 用法: Output Str_Addr
; 用法举例:Output PromptStr

Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -------------------------------------
; 功能:输出回车换行
Output_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
Output_CTLF endp
; -------------------------------------
; 功能:取光标位置
; 入口:无
; 出口:DH=行号,DL=列号
GetCursor Proc Near
PUSH AX
PUSH BX
PUSH CX
XOR BX,BX
MOV AH,3
INT 10H
MOV Cursor_Row,DH
MOV Cursor_Col,DL
POP CX
POP BX
POP AX
RET
Cursor_Row DB ?
Cursor_Col DB ?
GetCursor EndP
; -------------------------------------
; 功能:置光标位置
; 入口:Cursor_Row=行坐标; Cursor_Col: 列坐标)
SetCursor Proc Near
PUSH CX
PUSH BX
PUSH AX
MOV DH,Cursor_Row
MOV DL,Cursor_Col
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
RET
SetCursor EndP
; -------------------------------------
; 功能:键盘输入一个指定位数的十进制数字,将其转换成二进制数并保存在指定的内存单元。
; 由于限定最大数据类型为字,所以,数字位数最多:5,最大无符号数:65536
; 约定:直接回车,视为数字0
; 入口:@@Digits=数字位数;di=保存输入的数字首地址
; @@Type_Data=保存的数据类型,B=字节类型,W=字类型。
; 出口:转换后的二进制数保存在di所指的单元
Input_Digit Proc Near
CR equ 000DH
LF equ 000AH
KBBack equ 0008H
push dx
push cx
push bx
push di
lea di,@@Save_Tmp
push di
cld
mov cl,@@Digits
xor ch,ch
push cx
@@Input: call GetCursor ;取光标位置
mov ah,1 ;从键盘接受一个字符
int 21h
cmp al,CR ;若键入的是回车,已经键入的数字不足N位
jz @@ASC_Dec ;转去处理已经键入的数字
cmp al,KBBack
jz @@KB_Back ;若是回空键,重新输入
cmp al,'0'
jb @@KBBack ;若低于数字'0',重新输入
cmp al,'9'
ja @@KBBack ;若低于数字'9',重新输入
jmp @@Save_Dig
@@KB_Back: dec Cursor_Col
inc cx
dec di
@@KBBack: call SetCursor ;置光标位置
jmp @@Input
@@Save_Dig: and al,0fh ;转换成二进制数
stosb ;保存
loop @@Input ;接受下一个数字
@@ASC_Dec: mov ax,cx
pop cx
pop si
sub cx,ax ;实际输入的数字位数
xor bp,bp
xor dx,dx
xor ax,ax
jcxz @@Save_Ret ;若直接回车,没有输入任何数字,按输入'0'处理
dec cx ;实际输入的数字位数减1,准备把输入的这一串数字转换成二进制数
jcxz @@One_Digit ;若输入的数字只有一位,转去直接保存这个二进制数
mov bx,10
@@Mul_Ten: lodsb
cbw
add ax,bp
mul bx
mov bp,ax
loop @@Mul_Ten
@@One_Digit: lodsb
cbw
add ax,bp
@@Save_Ret: pop di
cmp @@Type_Data,'B' ;字节类型?
jz $+5
stosw
jmp $+3
stosb
pop bx
pop cx
pop dx
ret
@@Digits db ? ;十进制数字位数
@@Type_Data db 'B' ;保存的数据类型。B=字节类型,W=字类型
@@Save_Tmp db 7 dup(?)
Input_Digit EndP
; -------------------------------------
Month_01 db 'January$'
Month_02 db 'February$'
Month_03 db 'March$'
Month_04 db 'April$'
Month_05 db 'May$'
Month_06 db 'June$'
Month_07 db 'July$'
Month_08 db 'August$'
Month_09 db 'September$'
Month_10 db 'October$'
Month_11 db 'November$'
Month_12 db 'December$'
Month db ? ;月份数值
Addr_Month dw Month_01,Month_02,Month_03,Month_04,Month_05,Month_06
dw Month_07,Month_08,Month_09,Month_10,Month_11,Month_12 ;月份名称字符串地址
prompt_Str db 'Please input a month:$'
Press_Key db 7,13,10,13,10,'The complated. Press any key to exit...$'
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
xor bh,bh
Input_Month: Output prompt_Str ;提示输入月份值
mov @@Digits,2 ;十进制数字位数
mov @@Type_Data,'B' ;保存的数据类型。B=字节类型,W=字类型
lea di,Month ;月份值保存地址
call Input_Digit ;输入月份值
call Output_CTLF ;输出一个回车、换行
mov bl,Month ;提取月份值
test bl,bl
jz Exit_Proc ;直接回车或输入的月份值为0,结束程序
dec bl
shl bx,1
mov bx,Addr_Month[bx]
Output [bx]
call Output_CTLF
call Output_CTLF
jmp Input_Month
; -------------------------------------
Exit_Proc: Output Press_Key ;提示操作完成,按任意键结束程序
mov ah,1
int 21h
mov ah,4ch ;结束程序
int 21h
Buffer dw ?,? ;数据缓冲区
Code ENDS
END Start ;编译到此结束
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-11-30
;程序名jxxyy8.asm 输入格式在1~9前面要加0,为按回车键结束程序
CRLF MACRO;宏定义回车换行
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
ENDM
DATAS SEGMENT
y1 db 'January $'
y2 db 'February $'
y3 db 'March $'
y4 db 'April $'
y5 db 'May $'
y6 db 'June $'
y7 db 'July $'
y8 db 'August $'
y9 db 'September$'
y10 db 'October $'
y11 db 'November $'
y12 db 'December $'
yue db ?
DATAS ENDS

STACKS SEGMENT
db 20 dup(?)
STACKS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
B: call shuru
CRLF
call chazhao
call shuchu
CRLF
jmp B
exit:
MOV AH,4CH
INT 21H
shuru proc near
A: mov ah,01h
int 21h
cmp al,0dh
jz exit
sub al,30h
mov bl,10
mul bl
mov yue,al
mov ah,01h
int 21h
sub al,30h
add yue,al
ret
shuru endp

chazhao proc near
sub yue,1
mov al,10
mul yue
and ah,0
mov si,ax
ret
chazhao endp
shuchu proc near
mov dx,si
mov ah,09h
int 21h
ret
shuchu endp
CODES ENDS
END START

编程达人进,在线等汇编作业
这个问题麻烦的地方在于接受输入的月份,因为月份位数不等,带来处理上的繁琐。我图省事,把以前编的接收无符号数的子程序直接搬过来用了。至于确定对应月份的字符串地址及输出月份的英文单词,则很容易,不必编制独立的子程序。; 本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。Code Se...

VB编程达人请速进,今晚必需,在线等【穷举法】
你自己打开看看!代码在下面:Option Explicit Private Sub Command1_Click()Dim i As Integer Dim j As Integer Dim k As Integer Dim Y As Integer Dim n69 As Integer Dim n39 As Integer Dim n29 As Integer Y = 600 For i = 1 To 8 '设截取69CM的有i根,600\/69 最多为8 Fo...

学过编程的达人进
自学,这些都不太难,潜下去,半年能搞个差不多,要达到精通没有三五年是不行的。对一门语言的精通程度不是你学了多少,而是你用了多少,也就是说要达到精通就要看你编写过多少行程序了,没写过几万十几万行的程序,不要说精通

编程达人在线教育怎么样?
编程达人机构很不错的。讲师都是有3年以上开发经验的。课程囊括了汇编,c语言,c++,mfc,win32,qt基础,pe结构硬编码,网络编程,stl等编程主流。 无论是做正向开发还是逆向,编程达人都是一个不错的选择。关键的是,老师认真负责,还是线上班,最最最主要的是,学费比其他机构低很多,很多很多(重...

关于编程~达人进~
1.是PHP程序 2.window nt 5.1是Windows XP的系统核心技术,Windows 2000和Windows 2003都是用的NT技术。导致不能用这个程序的原因是这个程序只能在PHP的环境下运行,而且文件扩展名要为PHP。配制PHP运行环境不是几百个字能说得清楚的,那是配制网站服务器,如果你有兴趣可以去网上找一下方法,因为...

编程 求解释 求教导。。 编程达人进。。!!!
学校搞奥赛,内容只是算法。与你的需求相比,基本不对口,就是在一些ai设计上可能有帮助。当然,去参加也是有益的。除此之外,还要自学一些内容,比如ui设计。编程贵在持之以恒,因为编程是很苦的事。编程对机器要求不高。只要能用就行。除非你讲究效率。当然,搞奥赛的机器都不行,所以,你就有必要...

VB编程的题,达人进一下
1:首先,在窗体上新建一个按钮叫CmdEven,然后写入代码 sub CmdEven_Click()dim i dim sum sum = 0 for i=2 to 100 step 2 sum = sum + i next i print sum end sub 2:建立一个按钮,叫CmdOK,建立一个文本框,叫Text1,程序如下 sub CmdOK_Click()dim n n=val(Text1.text)print ...

Matlab达人进(编程)
temp = randn(5, 6);n = input('Which row to display?');if n < rows(temp),temp(n, :)else temp(end, :)end

C语言编程达人请进
,1,fp);sizeof(int)表示你写入的一块的大小,你用的是一个int大小。1表示你要写入的块的数目。显然在你机器上一个int是4个字节,而arr的类型是char *,一个char是1个字节,所以你写入4个字节大小的数据时就会写入四个字符。如果你要写入全部字符,改成 fwrite(&arr,sizeof(char),10,fp);...

C编程 问题 达人进
判断字符串大小,S1>S2返回1,<返回-1,=返回0 int f(char *s1, char *s2){ while(s1 && s2 && *s1==*s2)++s1,++s2;return *s1-*s2;} 也可以这么实现,简洁一些

相似回答