assembly 组合中的最大素因子

13z8s7eq  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(118)

我的程序应该打印给定数的最大素因子。我的方向是否正确?到目前为止,程序只是挂起,不打印任何内容。我是否遗漏了没有退出检查最大素因子的循环的内容?

.model small ; one data segment, one code segment
.stack 100h ; reserves 256 bytes for the stack
.386 ; for 32 bits
.data ; start definition of variables

; your variables go here

.code ; start code portion of program
main proc ; start of the main procedure
    mov  eax,@data ; load the address of the data segment into eax
    mov  ds,eax ; load the address of the data segment into ds
    ; the two previous instructions initalize the data segment

    ; your code goes here


;prime factor function
mov bx, 116984417 ;starting number
mov cx, 1         ;starting conter
xor dx, dx        ;clear data

mainloop:

mov ax, bx ;bx holds number and ax changes

inc cx ; increment counter
noinc:                 
mov bx, ax           

cmp ax, cx           
xor dx, dx ; clear data

div cx ;check for remainder
cmp dx, 0             
jz noinc           
jmp mainloop       
done:                
ret

;print function
mov bx,10 
xor cx,cx   
a:
xor dx,dx   
div bx
push dx   
inc cx
test ax,ax
jnz a
b:
pop dx   
add dl,"0"   
mov ah,02h
int 21h
loop b

    ; the following two instructions exit cleanly from the program
    mov  eax,4C00h ; 4C in ah means exit with code 0 (al) (similar to return 0; in C++)
    int  21h ; exit
main endp ; end procedure

end main ; end program
7gyucuyw

7gyucuyw1#

到目前为止程序只是挂起
不管你在 mainloop 中写了什么,它都没有任何出口,所以它会永远运行下去。
并且不打印任何内容。
您的print函数无法访问,因为存在无限的 mainloop,但也因为它前面的ret

mov bx, 116984417 ;starting number

可能是为了回答我对your previous question的回答,你在这个问题中是否从使用32位寄存器恢复过来了?你不应该这样做,因为这里的数字116,924,417对于任何16位寄存器来说都太大了。
另外,您是否注意到打字错误?在代码中,您使用116984417,而在随附文本中,您使用116924417。
这是我的搜索最大素因子的版本(初稿)。我已经在DOSBox中测试过了,它工作得很好:

116924417 -> 11587
116984417 -> 12497

结果适合16位AX,因此您可以继续使用16位打印功能。

; IN (eax) OUT (eax) MOD (ecx,edx,esi,edi)
LargestPrimeFactor:
  cmp  eax, 4              ; Number is its own LargestPrimeFactor
  jb   .done
  mov  ecx, 2
.nextFactor:
  mov  edi, ecx            ; EDI is TempLargestPrimeFactor
  mov  esi, eax
  lea  ecx, [edi - 1]
.nextDivision:
  inc  ecx
  mov  eax, esi
  xor  edx, edx
  div  ecx
  test edx, edx
  jz   .nextFactor
  cmp  ecx, eax
  jbe  .nextDivision
  mov  eax, esi
.done:
  ret

这个子例程在上下文中。如果你愿意的话,你当然可以把它变成一个proc。

.code
main proc
  mov  ax, @data           ; Not needed in this program
  mov  ds, ax              ; "
  mov  eax, 116924417
  call LargestPrimeFactor  ; -> EAX

  ...

  mov  ax, 4C00h
  int  21h
; -------------------------
LargestPrimeFactor:
  ...
  ret
main endp
end main

相关问题