所以这是我第一次在这里写帖子,我对汇编语言很陌生,从emu 8086开始了学习之旅。
最近我写了一个程序,它可以检测输入的数字是正数还是负数,并判断它是否是素数。我把它作为第一部分(使用数组检测正数或负数),但由于某种原因,它总是对我输入的任何数字说“不是素数”。
我试图让它复制存储在数组中的数字,并将其带到程序的素数/非素数部分,但没有用。
有人知道问题出在哪里吗?我现在很迷茫。
下面是我编写的代码:
.MODEL SMALL
.STACK 100H
.DATA
ARRAY DB DUP('$')
NUM DB ?
MSG1 DB 0AH,0DH,'ENTER YOUR DESIRED NUMBER:','$'
MSG2 DB 0AH,0DH,'NOT A PRIME NUMBER','$'
MSG3 DB 0AH,0DH,'A PRIME NUMBER','$'
POSI DB 0AH,0DH,'A POSITIVE NUMBER','$'
NEGA DB 0AH,0DH,'A NEGATIVE NUMBER','$'
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
MOV SI, OFFSET ARRAY
LEA DX,MSG1
MOV AH,9
INT 21H
MOV AH,1
INT 21H
CMP AL,13
JE CHECK
MOV [SI],AL
INC SI
JMP L1
L1:
MOV AH,1
INT 21H
CMP AL,13
JE CHECK
MOV [SI],AL
INC SI
JMP L1
CHECK:
CMP ARRAY, '-' ;IF ARRAY CONTAINS - SIGN THEN THE NUMBER IS NEGATIVE
JE L2
MOV DX, OFFSET POSI
MOV AH,9
INT 21H
JMP EXIT1
L2:
MOV DX, OFFSET NEGA
MOV AH,9
INT 21H
EXIT1:
mov al, [NUM]
mov bl, al
sub al, 2
mov cl, al ; counter value
; original input
mov dl, 2
l3:
mov ax, bx
div dl
cmp ah, 0h
jz pnot
inc dl
loop l3
mov ah, 9h
lea dx, msg3
int 21h
jmp end
pnot:
mov ah, 9h
lea dx, msg2
int 21h
END:
MOV AH,4CH
INT 21H
MAIN ENDP
END MAIN
任何帮助将不胜感激,提前感谢您!
1条答案
按热度按时间72qzrwbm1#
您正在将想要处理素数的新代码添加到已经损坏的程序中!
在
.DATA
部分中,您写入了:我不明白这是如何通过emu 8086的解析器看到
DUP
操作符的计数缺失的。可能 ARRAY 和 NUM 都引用了同一个内存地址,那里只保留了1个字节的空间。你的“正/负”程序输入一个多位数,前面有一个可选的减号,这个程序看起来工作得很好,因为你只比较了一个字节和“-”,第一条消息被覆盖了,没有显示出来。
你今天写的程序不是处理一个多位数的数字,而是处理输入的第一个数字(希望它确实是一个数字,而不是一个减号或其他字符)。
由于 ARRAY 的定义错误,
mov al, [NUM]
指令可以检索第一个数字**,但此数字仍为字符形式**。它是一个ASCII代码,范围在48到57之间。在将其用于计算之前,需要减去48。计算也是危险得错误,因为您将AX除以DL时不知道AH中得内容,并且使用依赖于CX寄存器得
loop
指令时不知道CH中得内容.下一个代码显示了修正。我没有尝试优化,因为在这种情况下,这几乎是不值得的...无论如何,总是有Checking Prime number in 8086 Assembly为那些对代码的优化版本感兴趣。