+ -
当前位置:首页 → 问答吧 → 高手抽空看一下。。。

高手抽空看一下。。。

时间:2010-12-01

来源:互联网

我编了一个汇编程序目的是求3250的约数并以十进制的形式显示出来,虽然我认为思路没错,指令也没用错,但运行时只能显示00001一个约数,后面就没了,帮忙指点一下,详细点
DATAS SEGMENT
  ;此处输入数据段代码  
DATAS ENDS

STACKS SEGMENT
  dw 32 dup(?)
   
STACKS ENDS

CODES SEGMENT
  ASSUME CS:CODES,DS:DATAS,SS:STACKS
main proc far
  mov si,1
  mov cx,0cb2h
  s:mov ax,0cb2h
  mov dx,0
  div si
  cmp dx,0
  jne s1
   
  mov bx,si
  call tern
  s1: inc si
  loop s
   
   
  finish:mov ax,4c00h
  int 21h
main endp
tern proc
  mov cx,10000
  call dec_div
  mov cx,1000
  call dec_div
  mov cx,100
  call dec_div
  mov cx,10
  call dec_div
  mov cx,1
  call dec_div
   
  mov ah,2
  mov dl,0
  int 21h;输出空格
ret
tern endp
dec_div proc
  mov ax,bx
  mov dx,0
  div cx
  mov bx,dx
  mov dl,al
  add dl,30H
  mov ah,2
  int 21h;显示字符
   
  ret
dec_div endp
   

   
CODES ENDS
  END main



作者: liufenfangwan   发布时间: 2010-12-01

tern proc中修改了CX,造成main proc中loop循环只有1次。

作者: shzhfu   发布时间: 2010-12-02

改了下,没成功,楼主多少给点分吧!


DATAS SEGMENT
  ;此处输入数据段代码  
DATAS ENDS

STACKS SEGMENT
  DW 32 DUP(?)
   
STACKS ENDS

CODES SEGMENT
  ASSUME CS:CODES,DS:DATAS,SS:STACKS
main PROC FAR
  MOV SI,1
  MOV CX,0cb2h
  s:MOV AX,0cb2h
  MOV DX,0
  DIV SI
  MOV DL,AH ;-----------------DIV后余数在AH中  
  CMP DX,0
  JNE s1
   
  MOV BX,SI
  CALL tern
  s1: INC SI
  LOOP s
  MOV AL,0  
  MOV AH,00h
  INT 16h  
   
  finish:MOV AX,4c00h
  INT 21h
   
main ENDP
tern PROC NEAR
PUSH CX ;-------------------保存现场  
PUSH AX
PUSH DX  
  MOV CX,1000
  CALL dec_div
  MOV AX,BX
  MOV CL,10
  DIV CL
  MOV BX,0
  MOV BL,AL  
  MOV CX,100
  CALL dec_div
  MOV AX,BX
  MOV CL,10
  DIV CL
  MOV BX,0
  MOV BL,AL  
   
   
  MOV CX,10
  CALL dec_div
  MOV AX,BX
  MOV CL,10
  DIV CL
  MOV BX,0
  MOV BL,AL  
   
  MOV CX,1
  CALL dec_div
   
   
   
  MOV AH,2
  MOV DL,32 ;----------------------空格的assiic是32
  INT 21h;输出空格
  POP CX  
  POP AX
  POP DX  
RET
tern ENDP
dec_div PROC NEAR
PUSH AX
PUSH DX
PUSH CX ;-------------------------保存现场  
PUSH BX  
  MOV AX,BX
  MOV DX,0
  DIV CX
   
  MOV DL,AL; ----------------------------商在al中
  ADD DL,30H
  MOV AH,2
  INT 21h;显示字符
  POP AX  
  POP DX
  POP CX  
  POP BX  
  RET
dec_div ENDP
   

   
CODES ENDS
  END main

作者: bobo98405208   发布时间: 2010-12-02

主要是那div的时候商是325,然而al只有八位,不知道该怎么解决,






而且我在程序最后做了按键等待,不知道为什么我都没按键,程序就结束了,等待哪位大大来给我解释下

作者: bobo98405208   发布时间: 2010-12-02

#1楼 说的已经其实很明白了,对楼主的程序在 call tern 指令前后加上保存和恢复 cx 的操作,结果就正确的。
#2楼考虑得反而复杂了。本来楼主的 dec_div 子程,用的就是 dx:ax/cx 啊,商和余数都是由 word 类的寄存器保存的,不会有商我 325 时的溢出问题。你这个代码,由于改动反而有了这个溢出问题,导致程序最后没有运行到等待输入那里就因溢出而结束了。

作者: zara   发布时间: 2010-12-02

受教了.......................

作者: bobo98405208   发布时间: 2010-12-02

第一次回答问题,楼主给点分把!




DATAS SEGMENT
  ;此处输入数据段代码  
DATAS ENDS

STACKS SEGMENT
  DW 32 DUP(?)
   
STACKS ENDS

CODES SEGMENT
  ASSUME CS:CODES,DS:DATAS,SS:STACKS
main PROC FAR
  MOV SI,1
  MOV CX,0cb2h
  s:MOV AX,0cb2h
  MOV DX,0
  DIV SI
  CMP DX,0
  JNE s1
   
  MOV BX,SI
  CALL tern
  s1: INC SI
  LOOP s
 MOV AH,0  
 INT 16h  
  finish:MOV AX,4c00h
  INT 21h
main ENDP
tern PROC
PUSH CX  
  
  MOV CX,1000
  CALL dec_div
  MOV CX,100
  CALL dec_div
  MOV CX,10
  CALL dec_div
  MOV CX,1
  CALL dec_div
   
  MOV AH,2
  MOV DL,0
  INT 21h;输出空格
  POP CX
RET
tern ENDP
dec_div PROC
  MOV AX,BX
  MOV DX,0
  DIV CX
  MOV BX,DX
  MOV DL,AL
  ADD DL,30H
  MOV AH,2
  INT 21h;显示字符
   
  RET
dec_div ENDP
   

   
CODES ENDS
  END main

作者: bobo98405208   发布时间: 2010-12-02