assembly 汇编程序,读取3个十进制数L1,L2,L3两位数,然后指示这些数是否可以代表三角形的边

j2datikz  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(90)

L2+L3>= L1 et L2+L1>= L3 et L1+L3>= L2是必须验证的3个条件,以承认它是否是三角形。我尝试了下面的代码,但它给了我错误的答案,我想知道为什么。

"data segment 
    ; add your data here! 
    msg1 db "entrez L1: $"
    msg2 db "entrez L2: $" 
    msg3 db "entrez L3: $" 
    res1 db "triangle invalide$" 
    res2 db "triangle valide$" 
    som1 db  255 
    som2 db  255 
    som3 db  255 
    ends
    
    stack segment dw   128  dup(0) ends
    
    code segment
    
    ;l1 bl ;l2 cl ;l3 dh
condition proc near
    mov [som1],cl
    add [som1],dh
    cmp [som1],bl
    jae etq
    
    etq:
    inc si 
    
    mov [som2],cl
    add [som2],bl
    cmp [som2],dh
    jae etq1
    
    etq1:
    inc si
    
    mov [som3],bl
    add [som3],dh
    cmp [som3],cl
    jae etq2
          
    etq2:
    inc si      
    ret      

start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax

    mov si,0  
              
    mov ah,09h
    mov dl,offset msg1
    
    int 21h
    
    mov ah,01h
    int 21h
    
    sub al,48
    mov bl,10d
    mul bl  
    mov bl,al ;l1 dans bl
    
    mov ah,01h
    int 21h
    sub al,48
    add bl,al
    
    mov ah,02h  
    mov dl,0Dh
    int 21h
    mov dl,0Ah
    int 21h
    
    mov ah,09h
    mov dl,offset msg2
    int 21h
    
    mov ah,01h
    int 21h           
    
    sub al,48
    mov cl,10
    mul cl
    mov cl,al  ;l2 dans cl
    
    mov ah,01h
    int 21h
    sub al,48
    add cl,al
    
    mov ah,02h  
    mov dl,0Dh
    int 21h
    mov dl,0Ah
    int 21h
    
    mov ah,09h
    mov dl,offset msg3
    int 21h
    
    mov ah,01h
    int 21h           
    
    sub al,48
    mov dh,10
    mul dh
    mov dh,al   ;l3 dans dh
    
    mov ah,01h
    int 21h
    sub al,48
    add dl,al 
    
    mov ah,02h  
    mov dl,0Dh
    int 21h 
    mov dl,0Ah
    int 21h
    
    call condition
    
    cmp si,3      
    je fin 
    jne fin
    
    mov ah,09h
    mov dl,offset res1
    int 21h
    
    jmp endd
    
    fin:
    mov ah,09h
    mov dl,offset res2
    int 21h 
     
    endd: 
    mov ax, 4c00h ; exit to operating system.
    int 21h    

ends
end start ; set entry point and stop the assembler."

字符串

lnxxn5zx

lnxxn5zx1#

引用我对你上一个问题的回答:

mov dl, offset msg

字符串
这是一个你应该注意的错误。DOS.PrintString函数09 h需要的是字长DX寄存器中字符串的地址。你不应该只加载低字节DL,而相信高字节DH包含0。所以写mov dx, OFFSET msg
在今天的程序中,您有多个相同错误的示例(5)!您是否阅读了其他答案?请阅读https://stackoverflow.com/help/someone-answers以了解收到答案后您的期望。谢谢。

其他问题

您将单个数字存储在BL、CL和DH寄存器中,但第三个寄存器出现了排印错误:

mov dh,al   ;l3 dans dh

mov ah,01h
int 21h
sub al,48
add dl,al


注意到你错误地添加到DL寄存器了吗?
你的 condition proc(我不得不改进混乱的布局)显示了我之前的回答已经谈到的另一个多个示例(3)!

mov [som1],cl
add [som1],dh
cmp [som1],bl
jae etq

etq:
inc si


如果条件是“等于或不等于”,那么你就需要增加SI并继续这个过程。这意味着你需要根据相反的条件跳出。目前,你只是高兴地继续比较是好还是坏。请参阅下一个解决方案,它不使用那些 som 变量,而是通过进位标志报告成功:

; IN () OUT (CF) L2+L3>= L1 et L2+L1>= L3 et L1+L3>= L2
condition:
  mov  al, cl
  add  al, dh
  cmp  al, bl
  jb   etq
  mov  al, cl
  add  al, bl
  cmp  al, dh
  jb   etq
  mov  al, bl
  add  al, dh
  cmp  al, cl
etq:
  ret                 ; CF=0 okay, CF=1 not okay
cmp si,3      
je fin 
jne fin

的字符串
jejne一起涵盖了cmp的所有可能结果。您将始终跳转到显示“triangle valide”的 fin
看看它是多么容易,并注意我如何改变 * 条件 * 通过进位标志报告(而不是在SI寄存器中计数):

call condition          ; -> CF
  mov  dx, offset res1    ; "triangle invalide"
  jc   fin
  mov  dx, offset res2    ; "triangle valide"
fin:
  mov  ah, 09h
  int  21h

相关问题