1、
assume cs:code, ss:stack
option casemap :none
stack segment
db 256 dup (?)
stack ends
trangle proto stdcall :WORD, :WORD
code segment
start:
mov ax, stack
mov ss, ax
mov sp, 256
invoke trangle, 7, '*'
invoke trangle, 7, '2'
mov ax, 4c00h
int 21h
trangle proc stdcall uses ax dx si di,
@rows :WORD, @symbol :WORD
xor di, di
mov ah, 2h
mov dl, byte ptr [@symbol]
xor di, di
.while di < @rows
xor si, si
.while si <= di
int 21h
inc si
.endw
inc di
mov dl, 13
int 21h
mov dl, 10
int 21h
mov dl, byte ptr [@symbol]
.endw
ret
trangle endp
code ends
end start
2、
assume cs:code, ds:datas, ss:stack
option casemap :none
NUMVARS equ 50
datas segment
var dd NUMVARS dup (?)
cnt dd 0
sum dd 0
ave dd 0
frc dd 0
hrd dd 100
flg dw 0
szErr db 'overflow',0
szNum db 'Enter the number of variables: ',0
szEnt db 'Enter these %_ numbers, use space or enter key as delimiter:', 13,10,0
szSum db 'Sum: %_',13,10,0
szAve db 'Average: %_.%_',13,10,0
szByd db 'Beyond average: ',0
szPhd db '%_ ',0
szTmn db 'Too many numbers',13,10,0
datas ends
stack segment
db 256 dup (?)
stack ends
input proto stdcall
iout proto stdcall :DWORD
print proto c :WORD, :VARARG
code segment
start:
mov ax, datas
mov ds, ax
mov ax, stack
mov ss, ax
mov sp, 256
invoke print, offset szNum
invoke input
mov word ptr [cnt], ax
cmp word ptr [cnt], NUMVARS
jg error_too_many
invoke print, offset szEnt, cnt
xor cx, cx
xor di, di
.while cx < word ptr [cnt]
invoke input
mov word ptr var[di], ax
mov word ptr var[di+2], dx
fild sum
fiadd var[di]
fistp sum
add di, 4
inc cx
.endw
finit
fild hrd
fild sum
fidiv cnt
fist ave
fimul hrd
fprem
fistp frc
invoke print, offset szSum, sum
invoke print, offset szAve, ave, frc
invoke print, offset szByd
xor di, di
xor cx, cx
finit
.while cx < word ptr [cnt]
fild var[di]
ficomp ave
fnstsw flg
mov ax, flg
sahf
jna @F
invoke print, offset szPhd, var[di]
@@:
add di, 4
inc cx
.endw
jmp done
error_too_many:
invoke print, offset szTmn
done:
mov ax, 4c00h
int 21h
;-------------------------------
; input proc
;-------------------------------
input proc near stdcall uses di
local @in_buf[12] :BYTE,
@in_num :DWORD,
@in_ten :WORD,
@in_tmp :WORD
mov word ptr [@in_num], 0
mov word ptr [@in_num+2], 0
mov @in_ten, 10
mov @in_tmp, 0
mov ah, 1h
xor di, di
.while 1
cmp di, 11
jge @in_error
int 21h
cmp al, 13
jz @in_newline
cmp al, ' '
jz @in_done0
mov @in_buf[di], al
inc di
.endw
@in_newline:
mov ah, 2h
mov dl, 13
int 21h
mov dl, 10
int 21h
@in_done0:
dec di
finit
fnstcw @in_tmp
or @in_tmp, 0c00h
fldcw @in_tmp
fld1
.while 1
cmp di, 0
jl @in_done1
xor ax, ax
mov al, @in_buf[di]
and al, 0Fh
mov @in_tmp, ax
fild @in_tmp
fmul st, st(1)
fiadd @in_num
fistp @in_num
fimul @in_ten
dec di
.endw
@in_error:
invoke print, offset szErr
@in_done1:
mov ax, word ptr [@in_num]
mov dx, word ptr [@in_num+2]
ret
input endp
;-------------------------------
; format output
;-------------------------------
print proc near c uses ax bx dx di si,
@szFmt :WORD, @args :VARARG
mov bx, @szFmt
xor di, di
mov si, 6
mov ah, 2h
.while byte ptr [bx+di] != 0
mov dx, [bx+di]
.if dx == 5f25h
invoke iout, [bp+si]
inc di
add si, 4
.else
int 21h
.endif
inc di
.endw
ret
print endp
;-------------------------------
; integer output
;-------------------------------
iout proc near stdcall uses ax dx di,
@arg :DWORD
local rmd :WORD, tmp :WORD, buf[16] :BYTE
finit
fnstcw tmp
or tmp, 0c00h
fldcw tmp
mov tmp, 10
fild word ptr [tmp]
xor di, di
.while word ptr [@arg] || word ptr [@arg+2]
fild @arg
fild @arg
fidiv tmp
fistp @arg
fprem
fistp word ptr [rmd]
mov dl, byte ptr [rmd]
or dl, 30h
mov buf[di], dl
inc di
.endw
dec di
mov ah, 2h
.if di & 8000h
mov dl, '0'
int 21h
.else
.while 1
cmp di, 0
.break .if sign?
mov dl, buf[di]
int 21h
dec di
.endw
.endif
ret
iout endp
code ends
end start
3、
assume cs:code, ss:stack, ds:datas
option casemap :none
datas segment
num1 dd ?
num2 dd ?
num3 dd 1
szErr db 'overflow',0
szNum db 'Enter num%_: ',0
szRes db '%_ + %_ = %_',0
datas ends
stack segment
db 256 dup (?)
stack ends
m2w macro dest
mov word ptr [dest], ax
mov word ptr [dest+2], dx
endm
input proto stdcall
iout proto stdcall :DWORD
print proto c :WORD, :VARARG
code segment
start:
mov ax, datas
mov ds, ax
mov ax, stack
mov ss, ax
mov sp, 256
invoke print, offset szNum, num3
invoke input
m2w num1
mov word ptr [num3], 2
invoke print, offset szNum, num3
invoke input
m2w num2
finit
fild num1
fiadd num2
fistp num3
invoke print, offset szRes, num1, num2, num3
mov ax, 4c00h
int 21h
;-------------------------------
; input proc
;-------------------------------
input proc near stdcall uses di
local @in_buf[12] :BYTE,
@in_num :DWORD,
@in_ten :WORD,
@in_tmp :WORD
mov word ptr [@in_num], 0
mov word ptr [@in_num+2], 0
mov @in_ten, 10
mov @in_tmp, 0
mov ah, 1h
xor di, di
.while 1
cmp di, 11
jge @in_error
int 21h
cmp al, 13
jz @in_newline
cmp al, ' '
jz @in_done0
mov @in_buf[di], al
inc di
.endw
@in_newline:
mov ah, 2h
mov dl, 13
int 21h
mov dl, 10
int 21h
@in_done0:
dec di
finit
fnstcw @in_tmp
or @in_tmp, 0c00h
fldcw @in_tmp
fld1
.while 1
cmp di, 0
jl @in_done1
xor ax, ax
mov al, @in_buf[di]
and al, 0Fh
mov @in_tmp, ax
fild @in_tmp
fmul st, st(1)
fiadd @in_num
fistp @in_num
fimul @in_ten
dec di
.endw
@in_error:
invoke print, offset szErr
@in_done1:
mov ax, word ptr [@in_num]
mov dx, word ptr [@in_num+2]
ret
input endp
;-------------------------------
; format output
;-------------------------------
print proc near c uses ax bx dx di si,
@szFmt :WORD, @args :VARARG
mov bx, @szFmt
xor di, di
mov si, 6
mov ah, 2h
.while byte ptr [bx+di] != 0
mov dx, [bx+di]
.if dx == 5f25h
invoke iout, [bp+si]
inc di
add si, 4
.else
int 21h
.endif
inc di
.endw
ret
print endp
;-------------------------------
; integer output
;-------------------------------
iout proc near stdcall uses ax dx di,
@arg :DWORD
local rmd :WORD, tmp :WORD, buf[16] :BYTE
finit
fnstcw tmp
or tmp, 0c00h
fldcw tmp
mov tmp, 10
fild word ptr [tmp]
xor di, di
.while word ptr [@arg] || word ptr [@arg+2]
fild @arg
fild @arg
fidiv tmp
fistp @arg
fprem
fistp word ptr [rmd]
mov dl, byte ptr [rmd]
or dl, 30h
mov buf[di], dl
inc di
.endw
dec di
mov ah, 2h
.if di & 8000h
mov dl, '0'
int 21h
.else
.while 1
cmp di, 0
.break .if sign?
mov dl, buf[di]
int 21h
dec di
.endw
.endif
ret
iout endp
code ends
end start
给你个EMIALL.自己去问吧,是我班主任的,他是汇编高手.
jym@cztvu.com