【发布时间】:2021-05-12 05:25:19
【问题描述】:
为了确定十六进制数是否为偶数,程序会将数字除以 2,余数应为零。如果不是,那么它是一个奇数。最初,我的计划是我有一个变量或寄存器,当十六进制被证明是偶数时它会增加。然后我会减去偶数的数量。到五得到奇数的数量。但由于我必须使用三个寄存器来保存被除数和除数 (AX & BX),再加上另一个用于数组计数器 (CX),所以我用完了寄存器来保存“偶数计数器”的值。
我修改了程序,使它仍然可以满足指令(见标题)。这一次,程序将显示字符E 表示偶数,O 表示奇数。我现在的问题是程序最多只能识别第二个数组项,这意味着 SI 的值保持不变并且在第二个数组项之后不会增加。这使得程序的输出为EOOOO 而不是EOOOE。
我的问题是:
1.) 我将如何从内存中增加SI 的值并将其传递给AX 进行除法
2.) 是否有可能使我的初始计划生效?如果是,我可以使用什么寄存器来保存“偶数计数器”
代码如下:
.MODEL SMALL
READ MACRO MSG
MOV AH,0AH
LEA DX,MSG
INT 21H
ENDM
SET MACRO MSG
MOV AH,09H
LEA DX,MSG
INT 21H
ENDM
.DATA
CR EQU 0DH
LF EQU 0AH
ARR DW 100h,16Fh,191h,10Fh,120h
MSG1 DB CR,LF,"Array of 16 bit hexadecimals: 100h,16Fh,191h,10Fh,120h$"
MSG2 DB CR,LF,"E=EVEN O=ODD$"
NUMERALEVEN DB CR,LF,"E$"
NUMERALODD DB CR,LF,"O$"
COUNT EQU 5H
DATA ENDS
.CODE
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
SET MSG1
SET MSG2
MOV SI,OFFSET ARR
MOV CL,COUNT
MOV AX,[SI]
MOV DX,0000
CHECK:
MOV DX,0000
MOV BH,00
MOV BL,02H ;divide by 2
DIV BX
CMP DX,0 ;checks if there is a remainder by comparing the remainder to 0
JE EVEN
JNE ODD
EVEN:
SET NUMERALEVEN
MOV DX,00
DEC CL
MOV AX,[SI+1]
MOV [SI],AX
CMP CL,0
JNZ CHECK
ODD:
SET NUMERALODD
DEC CL
MOV AX,00
MOV AX,[SI+1]
MOV [SI],AX
CMP CL,0
JNZ CHECK
CODE ENDS
END START
【问题讨论】:
-
只需在每次迭代结束时将 2 添加到
SI- 无需移动元素。请注意,它应该是 2,而不是 1,因为您正在处理单词。此外,不需要DIV。您可以通过使用TEST指令测试最低有效位来检查数字是奇数还是偶数。 -
计算机中的数字以二进制形式存储;这就是左移乘以 2 的原因。您只在源代码中使用十六进制;汇编器将 ASCII 十六进制源代码转换为二进制整数,就像您将它们写成十进制一样,例如 256 而不是 100h。只是我的一个术语,但我认为理解这一点很重要。