具体代码设计如下(不过有BUG)如果谁能解决invoke GetStdHandle, STD_OUTPUT_HANDLE 窗口命令执行两次的错误请留言:
源代码:
.686
.model flat, stdcall
option casemap : none
include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib
public judge
public ta
.data
_insize dword 8
ta db 8 dup(0);
count dw 20
mage1 db 'triangle!!', 0ah
mage2 db '请输入三条边,格式xx xx xx: (xx<64)',0ah
mage3 db 'error!!'
_size dword 80
.code
start:
mov cx, count;
mov bx, 0
push cx
invoke GetStdHandle, STD_OUTPUT_HANDLE
invoke WriteConsole, ax, offset mage2, sizeof mage2, offset _size, 0
pop cx
check :
mov ax, 0
push cx
invoke GetStdHandle, STD_INPUT_HANDLE
invoke ReadConsole, ax, offset ta, lengthof ta, offset _insize, 0
pop cx
mov ax, 0
call judge
cmp ax, 1
ja m1
mov bx, 0
push cx
invoke GetStdHandle, STD_OUTPUT_HANDLE
invoke WriteConsole, ax, offset mage1, sizeof mage1, offset _size, 0
pop cx
LOOP check
invoke ExitProcess,0
m1 :
sub cx, 1
cmp cx, 0
jbe exit
; invoke GetStdHandle, STD_OUTPUT_HANDLE
; invoke WriteConsole, ax, offset mage3, sizeof mage3, offset _size, 0
jmp check
exit:
invoke ExitProcess, 0
judge proc
deal:
;为了做两位数三角形边长判定,又因为输入的边长为db类型,不能自己形成三个十位数,所以在这里手动转换,例子ab cd ef转换=>(a*10+b,c*10+d,e*10+f)
sub ta, 48
sub ta+1, 48
mov al ,ta
imul ax , 10
add al , ta+1
mov ta , al
sub ta + 3, 48
sub ta + 4, 48
mov al, ta+3
imul ax, 10
add al, ta+4
mov ta+2, al
sub ta + 6, 48
sub ta + 7, 48
mov al, ta + 6
imul ax, 10
add al, ta + 7
mov ta + 4, al
;这里做的是三角形的判定,因为懒没有封装,就赋值粘贴了三次,比较三次嘛(改一下变量就行了),其实更好的风格是封装起来。
mov al, ta
mov ah, 0
mov bl, ta+2
mov bh, 0
add ax, bx
cmp al, ta+4
jbe NO
mov al, ta
mov ah, 0
mov bl, ta+4
mov bh, 0
add ax, bx
cmp al, ta+2
jbe NO
mov al, ta+2
mov ah, 0
mov bl, ta+4
mov bh, 0
add ax, bx
cmp al, ta
jbe NO
mov ax, 0
ret
NO : mov ax, 2
ret
judge endp
END start
运行结果