3、从键盘输入100以内的数,判断该数字是奇数还是偶数。如果是奇数输出小于该数且能被5整除的数,然后求他们之和;如果是偶数则输出该数分别除以3,5,7的余数。
格式如下:
Please enter a number: 45(按回车)(10%) Result: 5、10、15、20、25、30、35、40(按回车)(30%) Sum: 180(按回车)(20%) Continue(y/n)? (10%)
若输入y则继续,若输入n则退出
Please enter a number: 44(按回车)
Result: 2、4、2(按回车)(30%) Continue:(y/n)?
若输入y则继续,若输入n则退出
DATA SEGMENT
DATA1 DB 20 DUP(?) ;存缓冲区输入的字符串
DATA2 DB 20 DUP(30H)
DATA3 DB?;用来存转换后的10进制
BUFF DB 50
DB?
DB 50 DUP(?)
DATA ENDS
STACK SEGMENT
ST1 DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
START3:
MOV AX,DATA ;占源的设计,才可以使用PUSH,POP
MOV DS,AX
MOV AX,STACK
MOV SS,AX
CALL TR
LEA DX,BUFF
MOV AH,0AH
INT 21H ;从键盘接收字符串到内存的输入缓冲区(3句)
;读取数据到缓冲区,BUFF(键盘输入,一般是Enter结束)
CALL TR
LEA SI,BUFF ;SAV调用之前先给DI,SI赋值
LEA DI,DATA1
CALL SAV ;把缓存区的输入字符存到数据data1中(3句)
LEA DX,DATA1 ;打印,显示data1,查看你存入的DATA1 跟你输出的是否一样MOV AH,09H ;AH 09功能调用,显示字符串
INT 21H
CALL TR
LEA DI,DATA1 ;data1数据存到Ax中,存为数值(10进制)
XOR DX,DX
MOV DL,10
MOV AX,0
L2:
MOV BL,[DI]
INC DI ;INC +1指令
CMP BL,24H ;24H -> '$' ,也就是输入的结束符,或者是‘/0’
JE JUMP1 ;相等时跳转,数据存完在AX,开始下一步
SUB BL,30H
MUL DL
ADD AL,BL
JMP L2
JUMP1:
LEA SI,DATA3
MOV [SI],AL
MOV AL,[SI]
XOR AH,AH
MOV DL,2
DIV DL ;ax除以DL中的值,商放AL,余数放AH
CMP AH,0
JE OSHU ;余数是0,则为偶数
JMP JISHU ;无条件转移,转到奇数
START1: JMP START3
OSHU: ;偶数
LEA SI,DATA3
MOV AL,[SI]
MOV DL,3 ;3的余数
DIV DL
MOV DL,AH
ADD DL,30H
MOV AH,02H
INT 21H ;AH为余数,赋给DL,AH的02号功能将DL 的字符显示在屏幕
MOV DL,' '
MOV AH,02H
INT 21H
XOR AH,AH
LEA SI,DATA3
MOV AL,[SI]
MOV DL,5 ;5的余数
DIV DL
MOV DL,AH
ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,' '
MOV AH,02H
INT 21H
XOR AH,AH
LEA SI,DATA3
MOV AL,[SI]
JMP S1
START2: JMP START1
S1: MOV DL,7 ;7的余数
DIV DL
MOV DL,AH
ADD DL,30H
MOV AH,02H
INT 21H
CALL TR
JMP J9
JISHU: ;奇数操作
XOR AH,AH
LEA SI,DATA3
MOV AL,[SI]
MOV DL,5
DIV DL ;AL 为商
MOV DL,AL
MOV CL,AL ;循环会用到CL,用跳转代替的循环
XOR BX,BX ;归0
XOR AL,AL ;归0
MOV CH,1 ;用来计数,直到最后与CL相等
JISHU1:
MOV AL,CH
MOV DL,5
MUL DL ;AX=AL*DL;如果是奇数输出小于该数且能被5整除的数,然后求他们之和;
;从5、10、15 … 5*N 直到5*(N+1)>你输入的数;5 = 1*5 XOR AH,AH
ADD BX,AX ;和存入BX中
ADD CH,1 ;CH计数+1
; MOV AL,15
MOV DL,10
DIV DL ;AL 为AX/源的商AH为AX/源的余数;除以10
PUSH AX ;保存AX,即除法结果
CMP AL,0 ;是否小于10
JE J4 ;JE/JZ相等时跳转, 小于10跳转,因为大于10 的打印跟小于的不一样
MOV DL,AL ;大于10 打印十位
ADD DL,30H
MOV AH,02H
INT 21H ;打印出来该数
POP AX
J4:
MOV DL,AH
ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,' ';打印空格
MOV AH,02H
INT 21H
CMP CL,CH
JB J3
JMP JISHU1 ;跳转
J3:
CALL TR
LEA SI,DATA3
MOV AX,BX ;BX为求和结果,给AX
CALL SPRINT1 ;注意DATA3以后存入的不是你输入的数了,而是和的字符串
LEA DX,DATA3
MOV AH,09H
INT 21H
J9:CALL TR
MOV AH,01H ;是否继续
INT 21H
CMP AL,'y'
JE START2
MOV AX,4C00H
INT 21H
TR PROC ;TR 回车换行的小模块代码
MOV DL,0AH ;换行
MOV AH,02H
INT 21H
MOV DL,0DH ;回车
MOV AH,02H
INT 21H
RET
TR ENDP
SAV PROC ;SAV 输入的字符串,存到data;直接把缓冲区的数据存到data
;调用之前先给DI,SI赋值,DI为SAV的目的操作数,SI为源操作数MOV CL,[SI+1]
XOR CH,CH
ADD SI,2
L1:LODSB ;BUFF 读入累加器
MOV [DI],AL
INC DI
LOOP L1
MOV AL,'$'
MOV [DI],AL
RET
SAV ENDP
SPRINT PROC ;这个函数没用到,因为当时临时写了另一个SPRINT1,这个应该是出问题了
MOV DL,10
D1:DIV DL
ADD AH,30H
MOV [SI],AH
INC SI
XOR AH,AH
CMP AX,0
JE D2
JMP D1
D2:MOV AL,'$'
MOV [SI],AL
RET
SPRINT ENDP
SPRINT1 PROC ;数值转化为字符串的函数输入AX 输出data3 PUSH SI
PUSH AX
ADD SI,5
MOV DL,10
MOV AL,24H
MOV [SI],AL ;事先出入结束符到SI中
POP AX
; XOR AH,AH
DEC SI ;自减是因为我们先存入各位,由低到高如123 先从后面存入3 比较好编程
D6: DIV DL ;求当前最低位
ADD AH,30H
MOV [SI],AH ;当前最低位存入字符串中
DEC SI ;自减是因为我们先存入各位,由低到高如123 先从后
XOR AH,AH
CMP AX,0 ;判断商是否为0 即AL=0?不
JE D7 ;判断商是否为0 即AL=0则
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示已经转化完毕(10进制到字符串转化)
JMP D6
D7:
POP DI
MOV AL,' ';前面的存入空格,因为我们定义了4位,但是如果实际只有123 则字符串为‘ 123’而不是‘123’,‘?123’
D8:
CMP SI,DI
JB D9
MOV [SI],AL
DEC SI
JMP D8
D9:
RET
SPRINT1 ENDP
P1 PROC ;此函数没有用到
XOR BL,BL
L7:
LODSB ;具体操作是把SI指向的存储单元读入累加器,
;LODSB就读入AL,LODSW就读入AX中,然后SI自动增加或减小1或2.其常常是对数组或字符串中的元素逐个进行处理。
JMP L7
RET
P1 ENDP
CODE ENDS
END START