Я пытаюсь написать подпроцедуру, которая будет подсчитывать количество битов, установленных в 16-битном числе, а затем отправлять это число (набор битов) обратно в основную процедуру в AX. На главном экране должно отображаться число 1 и определяется, является ли число четным или нечетным.
Я пытаюсь считать 1 с, сдвигая влево и увеличивая при переносе. Кажется, проблема в том, что, когда я возвращаюсь к «основному», исходный входной номер все еще в AX, а не в подсчете, который я получил в «четности». Я не знаю, почему это не меняется.
;===================================================================
; MAIN.ASM
;===================================================================
EXTERN GETDEC$:FAR
EXTERN NEWLINE:FAR
EXTERN PUTSTRNG:FAR
EXTERN PUTDEC$:FAR
EXTERN PUTBIN:FAR
EXTERN PARITY:FAR
;===================================================================
.MODEL LARGE
.STACK 512
;===================================================================
; D A T A S E G M E N T D E F I N I T I O N
.DATA
NUMBER DW ?
PROMPT DB 'Enter a number: '
BINDISPLAY DB 'Number in binary: '
ONESDISPLAY DB 'Number of 1s: '
ODDDISPLAY DB 'The number of 1s is odd. '
EVENDISPLAY DB 'The number of 1s is even. '
;===================================================================
; C O D E S E G M E N T D E F I N I T I O N
.CODE
ASSUME DS:DGROUP
;===================================================================
MAIN PROC
MOV AX,DGROUP ;SET DS-REGISTER TO POINT TO
MOV DS,AX ;DATA SEGMENT
MOV ES,AX ;AND ES ALSO
CALL NEWLINE
MOV DI, OFFSET PROMPT
MOV CX, SIZEOF PROMPT
CALL PUTSTRNG
CALL GETDEC$
CALL NEWLINE
MOV DI, OFFSET BINDISPLAY
MOV CX, SIZEOF BINDISPLAY
CALL PUTSTRNG
CALL PUTBIN
PUSH AX
CALL PARITY
CALL NEWLINE
CALL NEWLINE
MOV DI, OFFSET ONESDISPLAY
MOV CX, SIZEOF ONESDISPLAY
CALL PUTSTRNG
POP AX
CALL PUTDEC$
CALL NEWLINE
SUB DX, DX
MOV BX, 2
DIV BX
CMP DX, 0
JNE ODDS
MOV DI, OFFSET EVENDISPLAY
MOV CX, SIZEOF EVENDISPLAY
CALL NEWLINE
CALL PUTSTRNG
JMP EXIT_PROGRAM
ODDS:
MOV DI, OFFSET ODDDISPLAY
MOV CX, SIZEOF ODDDISPLAY
CALL NEWLINE
CALL PUTSTRNG
EXIT_PROGRAM:
.EXIT
MOV AX, 4C00H
INT 21H
MAIN ENDP
END MAIN
;;===================================================================
; Veronica Kaufman
; CISP 310
; PARITY.ASM
;===================================================================
.MODEL LARGE
;===================================================================
; D A T A S E G M E N T D E F I N I T I O N
.DATA
ONES_COUNT DW 0
;===================================================================
; C O D E S E G M E N T D E F I N I T I O N
.CODE
ASSUME DS:DGROUP
;===================================================================
PARITY PROC FAR PUBLIC USES CX DX DS
POP AX
NUM_LOOP:
CMP AX, 0
JE END_PROGRAM
SHL AX, 1
JC INCREMENT
JMP NUM_LOOP
INCREMENT:
INC ONES_COUNT
JMP NUM_LOOP
END_PROGRAM:
MOV AX, ONES_COUNT
PUSH AX
RET
PARITY ENDP
END PARITY