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

问题描述 投票:0回答:1

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."
assembly decimal x86-16 emu8086 triangle
1个回答
0
投票

引用我对你之前问题的回答

mov dl, offset msg

这是一个您应该注意的错误。 DOS.PrintString 函数 09h 需要字大小的 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 寄存器?


您的条件过程(为此我必须改进混乱的布局)显示了我之前的答案已经讨论过的另一个多个实例(3)!

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

etq:
inc si 

AboveOrEqual 条件是合适的,您将增加 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

je
jne
一起涵盖了
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
© www.soinside.com 2019 - 2024. All rights reserved.