5.2 在ADDR单元中存放着数Y的地址,试编制一个程序,把Y中1的个数存入COUNT单元中
要点1:JZ EXIT和JNS SHIFT的使用
DATAS SEGMENT
COUNT DW 0
ARRD DW NUMBERY
NUMBERY DW 003FH
DATAS ENDS
STACKS SEGMENT
DW 30H DUP(0)
TOP LABEL WORD
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
LEA SP,TOP
MOV BX,ARRD
MOV AX,[BX] ;取NUMBERY的内容
L1: TEST AX,0FFFFH
JZ EXIT ;检查当前数字是否全为0,全为0则结束
JNS SHIFT ;检查当前最高位是否为0,若为0就跳转
INC COUNT
SHIFT:
SHL AX,1
JMP L1
EXIT:
MOV DX,COUNT
ADD DX,30H
MOV AH,02H
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
输出:
以二进制输出
S1 SEGMENT STACK
DW 30H DUP(0)
TOP LABEL WORD
S1 ENDS
S2 SEGMENT
NUM DW 6B3DH
S2 ENDS
S3 SEGMENT
ASSUME CS:S3,DS:S2,SS:S1
MAIN PROC FAR
MOV AX,S1
MOV SS,AX
LEA SP,TOP
MOV AX,S2
MOV DS,AX
MOV BX,NUM
MOV CX,16
NEXT: XOR DL,DL ;注意清零!!
ROL BX,1
ADC DL,30H ;带进位加法,结合左移
MOV AH,2
INT 21H
LOOP NEXT
MOV AH,4CH
INT 21H
MAIN ENDP
S3 ENDS
END MAIN
以八进制输出
要点一:一共十六位,最高位单独处理;剩余15位,呈3位一组输出
DATAS SEGMENT
NUM DW 6751H
DATAS ENDS
STACKS SEGMENT
DW 30H DUP(0)
TOP LABEL WORD
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
LEA SP,TOP
L1: MOV BX,NUM
ROL BX,1
MOV DX,BX
AND DX,1
ADD DX,30H
MOV AH,02H
INT 21H
MOV CX,5
L2: PUSH CX
MOV CL,3
ROL BX,CL
MOV DX,BX
AND DX,07H
ADD DX,30H
MOV AH,02H
INT 21H
POP CX
LOOP L2
MOV AX,4CH
INT 21H
CODES ENDS
END START
以十进制输出
DATAS SEGMENT
NUM DW 0012H
COUNT DW 0
DATAS ENDS
STACKS SEGMENT
DW 30H DUP(0)
TOP LABEL WORD
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
LEA SP,TOP
;除10取余法
MOV AX,NUM
MOV DI,10
L1: CMP AX,0
JE NEXT ;若商为0
MOV DX,0 ;保证每次被除数都是正确的,因为DX:AX / DI
DIV DI
PUSH DX
INC COUNT
JMP L1
NEXT:
MOV CX,COUNT
PRINT:
POP DX
ADD DX,30H
MOV AH,02H
INT 21H
LOOP PRINT
CODES ENDS
END START
输入:
输入16位二进制 并存在NUM中
DATAS SEGMENT
NUM DW ?
DATAS ENDS
STACKS SEGMENT
DW 30H DUP(0)
TOP LABEL WORD
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
LEA SP,TOP
;输入16位二进制数
MOV BX,0
MOV CX,16
L1: MOV AH,01H
INT 21H
CMP AL,0DH
JE NEXT
CMP AL,'0'
JB L1
CMP AL,'1'
JA L1
ROL BX,1
SUB AL,30H ;转化为数值
MOV AH,0
ADD BX,AX
LOOP L1
;8进制输出验证
NEXT:
MOV [NUM],BX
MOV AH,02H
MOV DL,0AH
INT 21H
ROL BX,1
MOV DX,BX
AND DX,1
ADD DX,30H
MOV AH,02H
INT 21H
MOV CX,5
L2: PUSH CX
MOV CL,3
ROL BX,CL
MOV DX,BX
AND DX,07H
ADD DX,30H
MOV AH,02H
INT 21H
POP CX
LOOP L2
EXIT:
MOV AH,4CH
INT 21H
CODES ENDS
END START
输入5位八进制数
DATAS SEGMENT
NUM DW ?
DATAS ENDS
STACKS SEGMENT
DW 30H DUP(0)
TOP LABEL WORD
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
LEA SP,TOP
MOV BX,0
MOV CX,5
L1: PUSH CX
MOV AH,01H
INT 21H
CMP AL,0DH
JE NEXT
CMP AL,'0'
JB L1
CMP AL,'7'
JA L1
MOV CL,3
ROL BX,CL
SUB AL,30H ;转化为数值
MOV AH,0
ADD BX,AX
POP CX
LOOP L1
;存储在NUM中
NEXT:
MOV [NUM],BX
MOV AH,02H
MOV DL,0AH
INT 21H
;8进制输出验证
MOV CX,5
L2: PUSH CX
MOV CL,3
ROL BX,CL
MOV DX,BX
AND DX,07H
ADD DX,30H
MOV AH,02H
INT 21H
POP CX
LOOP L2
EXIT:
MOV AH,4CH
INT 21H
CODES ENDS
END START
输入16进制数/输出16进制数
DATAS SEGMENT
NUM DW ?
DATAS ENDS
STACKS SEGMENT
DW 30H DUP(0)
TOP LABEL WORD
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
LEA SP,TOP
;输入十六进制的数存到NUM中
MOV BX,0
MOV CX,4
L1: PUSH CX
MOV AH,01H
INT 21H
CMP AL,0DH
JE NEXT
CMP AL,'0'
JB L1
CMP AL,'7'
JA L2
SUB AL,30H
JMP NEXT1
L2: ;判断是否为A-F或a-f
CMP AL,'A'
JB L1
CMP AL,'Z'
JBE L3
CMP AL,'a'
JB L1
CMP AL,'z'
JA L1
SUB AL,20H
L3: SUB AL,37H
NEXT1:
MOV CL,4
ROL BX,CL
MOV AH,0
ADD BX,AX
POP CX
LOOP L1
;存储在NUM中
NEXT:
MOV [NUM],BX
MOV AH,02H
MOV DL,0AH
INT 21H
;16进制输出验证
MOV CX,4
L4: PUSH CX
MOV CL,4
ROL BX,CL
MOV DX,BX
AND DX,0FH
CMP DX,9 ;输出要和数字比较,而不是字符
JBE NEXT2
ADD DX,07H ;输出英文大写即可,不用分大小写
NEXT2:
ADD DX,30H
MOV AH,02H
INT 21H
POP CX
LOOP L4
EXIT:
MOV AH,4CH
INT 21H
CODES ENDS
END START
P170:例5.6 试编制一程序,从键盘输入一行字符,要求第一个键入的字符必须是空格,如不是,则退出程序;如是,则开始接收键入的字符并顺序存放在首地址为BUFFER的缓冲区中(空格符不存入),直到接收到第二个空格时退出程序。
DATAS SEGMENT
BUFFER DW 30 DUP(0) ;分清定义的类型DW还是DB,要和下面的BX加的统一
FLAG DW 0
DATAS ENDS
STACKS SEGMENT
DW 30H DUP(0)
TOP LABEL WORD
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
LEA SP,TOP
LEA BX,BUFFER
L1: MOV AH,01H
INT 21H
TEST FLAG,1
JNZ NEXT ;ZF=0,说明结果为1,说明两者相等
CMP AL,20H ;和空格比较
JNE EXIT
MOV FLAG,1
JMP L1
NEXT:
CMP AL,20H
JZ EXIT
MOV AH,0
MOV [BX],AX
ADD BX,2
JMP L1
EXIT:
MOV AH,4CH
INT 21H
CODES ENDS
END START
3508

被折叠的 条评论
为什么被折叠?



