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."
引用我对你之前问题的回答:
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。 call condition ; -> CF
mov dx, offset res1 ; "triangle invalide"
jc fin
mov dx, offset res2 ; "triangle valide"
fin:
mov ah, 09h
int 21h