回 帖 发 新 帖 刷新版面

主题:[讨论]讨论加分贴:讨论一个汇编错误

先看下面一段代码:
.model small   
.data
    NumFirst_2 db 0,0,0,0,0,0,0,0,0,0,1,5,2,3,6,5
    NumSec_2 db 0,0,0,0,0,0,0,0,0,0,0,0,1,2,5,4  
    Answertemp db 17 dup(0)
    AnswerMul db 32 dup(0)  
    MulPoint db 0  
    length_1 dw 6
    length_2 dw 4 
    SiStore dw 0
    CxStore dw 0
.code
main proc far     
    start:
    mov ax,@data
    mov ds,ax
    ;call DataInput  
    ;call DataCorrect  
    call DataOutput
    
    mov cx,0
    mov cx,word ptr length_2
    mov si,15
    Label_mul_loop: 
    mov SiStore,si
    mov CXStore,cx
     
    call Mul_part
    call ShiftR
    call Add_part  
    call SetZeroMul;//set AnswerMul[] by 0   
    mov cx, CxStore
    mov si,SiStore
    dec si
    dec cx
    jnz Label_mul_loop 
    call Mul_output
    ret
main endp  
Mul_part proc near  
   ; mov si,15  
   mov di,15
    mov cx,0
    mov cx,word ptr length_1
    Mul_part_loop:  
    mov al,numSec_2[si]
    mov bl,numFirst_2[di]
    mul bl
    aam
    add al,Answertemp[di + 1]
    aaa
    mov  Answertemp[di + 1],al
    mov  Answertemp[di],ah
    mov ax,0   
    dec di
    dec cx
    jnz Mul_part_loop
      
    
    ;/////////////   
    mov si,0
    mov cx,17  
    call Newline
    Mul_part_output:
        mov dl, Answertemp[si]
        add dl,30h
        mov ah,2
        int 21h 
        inc si
        dec cx
        jnz Mul_part_output   
    call Newline
    ret
Mul_part endp    
ShiftR proc near  
    mov si,31
    mov cx,31
    ShiftR_label:
        mov al,AnswerMul[si - 1]
        mov AnswerMul[si]  ,al
        dec si
        dec cx
        jnz ShiftR_label  
        mov al,MulPoint 
        mov AnswerMul[0],al
        mov al,0
        mov MulPoint,al
    ret
ShiftR endp    
Add_part proc near  
    mov si,16
    mov cx,17 
    clc
    Add_part_loop:
        mov al,AnswerMul[si]
        adc al,Answertemp[si]
        aaa
        mov AnswerMul[si],al
        dec si
        dec cx
        jnz Add_part_loop    
        mov al,0
        adc al,0
        mov MulPoint,al
    ret
Add_part endp 

回复列表 (共2个回复)

沙发

Mul_output proc near  
    ;mov al,NumFirst[16] 
   ; cmp al,'+'
    ;jnz Mul_cmp_2
    ;Mul_cmp_1: 
       ; mov al,  NumSec_2[16]
       ; cmp al,'+' 
      ;  jz Mul_output_output_1   
       ; jmp  Mul_output_output_2
    ;Mul_cmp_2: 
      ;  mov al,  NumSec_2[16]
        ;cmp al,'+' 
      ;  jz Mul_output_output_2   
       ; jmp  Mul_output_output_1
   ; Mul_output_output_1:  ;///同号输出  
       
        ;mov si,16
       ; sub si,word ptr length_1
       ; mov cx,word ptr length_1
       ; mov cx,si
       ; add cx,word ptr length_2   
       mov si,0
       mov cx,32
       Mul_output_output: 
            mov dl,AnswerMul[si]
            add dl,30h
            mov ah,2
            int 21h
            inc si
            dec cx
            jnz Mul_output_output
            
       ; jmp Mul_output_end
   ; Mul_output_output_2:  ;///异号输出     
        ;mov si,16
       ; sub si,word ptr length_1
       ; mov cx,0
        ;mov cx,word ptr length_1
       ; add cx,word ptr length_2 
      ;  mov dl,'-'
      ;  mov ah,2
      ;  int 21h  
      ; mov si,0
      ; mov cx,32
      ;  Mul_output__1: 
      ;      mov dl,AnswerMul[si]
          ;  add dl,30h
         ;   mov ah,2
         ;   int 21h
           ; inc si
           ; dec cx
         ;   jnz Mul_output__1
         ;   
   ; Mul_output_end:   
    ;call Newline
    ret
Mul_output endp
SetZeroMul proc near   
    mov si,0
    mov cx,17
    SetZeroMul_label:
        mov al,0
        mov Answertemp[si],0
        inc si
        dec cx
        jnz  SetZeroMul_label
    ret
SetZeroMul endp  
DataOutput proc near

    call Newline

    
    
    mov cx,0
    mov cx,word ptr length_1 
    mov si,16
    sub si,word ptr length_1
    label_out_1:
        mov dl,NumFirst_2[si]   
        add dl,30h
        mov ah,2  
        int 21h   
        ;////////////////////////////输出之后立即将ASCII--〉十进制数

        inc si
        dec cx
    jnz label_out_1
    
    mov dl,'*'
    mov ah,2
    int 21h 
    
    mov cx,0
    mov cx,word ptr length_2
    mov si,16
    sub si, word ptr length_2
    label_out_2:
        mov dl,NumSec_2[si]   
        add dl,30h
        mov ah,2
        int 21h  
   
        inc si
        dec cx
        jnz label_out_2
    
    mov dl,'='
    mov ah,2
    int 21h
    
    ret
DataOutput endp  
Newline proc near
    mov dl,0ah
    mov ah,2
    int 21h
    mov dl,0dh
    mov ah,2
    int 21h
    ret
Newline endp
end start
运行后出现一个对话框错误:
C:\WINDOWS\system32\command.com
NTVDM CPU 遇到无效的指令
CS:848a IP:f1f0 OP:0c 33 0f 33 30 选择“关闭”终止应用程序
        关闭                 忽略
大家说一下这个错误为什么发生啊?
PS:但是这个程序在emu8086下面可以正常运行

板凳

指导错误了,忘记mov ah,4ch/int 21h 了

我来回复

您尚未登录,请登录后再回复。点此登录或注册