?? convert.asm
字號:
.MODEL COMPACT
.486
;---------------------------------------------------------------
;宏定義
HAA MACRO X
X: MOV AL,[SI]
MOV [DI],AL
INC SI
INC DI
CMP BYTE PTR [SI],20H
JNE X
JMP B1
ENDM
HBB MACRO
MOV AH,[SI]
AND AH,0FH
MOV [DI],AH
ENDM
WRITE MACRO
MOV AH,9
INT 21H
ENDM
HMTPF MACRO
MOV EAX,0
MOV AX,y1
MOV ECX,srowlength
MUL ECX
MOV ECX,EAX
MOV EAX,0
MOV AX,x1
MOV DX,3
MUL DX
ADD EAX,ECX
ADD EAX,54
ENDM
HEAX MACRO
MOV DX,AX
ROL EAX,16
MOV CX,AX
ENDM
Rx1y1 MACRO
HMTPF
HEAX
CALL movepoint
LEA DX,T1T2
MOV CX,6
CALL readh
ENDM
Rx1y2 MACRO
HMTPF
ADD EAX,srowlength
HEAX
CALL movepoint
LEA DX,T3T4
MOV CX,6
CALL readh
ENDM
CTRL MACRO
LEA DX,CTR
MOV AH,9
INT 21H
ENDM
;---------------------------------------------------------------
.STACK 200
.DATA
bmp DB 54 DUP(0) ;存放原圖片和新圖片的前54個字節數據
bdata DB 30720 DUP(0) ;暫時存放新圖片的一個掃描行的像素數據
buf DB 80
DB ?
DB 80 DUP(0)
spathname DB 30 DUP(0) ;原圖片的路徑
ppathname DB 30 DUP(0) ;新圖片的路徑
handle DW 0 ;原圖片文件代號
phandle DW 0 ;新圖片文件代號
m DW 0 ;m、n只能是1-9數字
n DW 0
sf DD 0 ;縮放系數
swidth DD 0 ;原圖片寬度
sheight DD 0 ;原圖片高度
outwidth DD 0 ;新圖片寬度
outheight DD 0 ;新圖片高度
srowlength DD 0 ;原圖片一個掃描行的字節數
prowlength DD 0 ;新圖片一個掃描行的字節數
sbbyte DB 0 ;原圖片一個掃描行要補的字節數
pbbyte DB 0 ;新圖片一個掃描行要補的字節數
x1 DW 0
x2 DW 0
y1 DW 0
y2 DW 0
u DD 0
v DD 0
p1 DW 0 ;(x1,y1)坐標處一個像素的RGB分量之一
p2 DW 0 ;(x2,y1)...........................
p3 DW 0 ;(x1,y2)...........................
p4 DW 0 ;(x2,y2)...........................
i DD 0 ;寬度循環變量
j DD 0 ;高度循環變量
f1 DD 0
ppixel DW 0 ;(i,j)坐標一個像素的RGB分量之一
T1T2 DB 6 DUP(0) ;
T3T4 DB 6 DUP(0) ;
input DB 'exam:',0DH,0AH,'D:\football.bmp D:\new.bmp 2 1',0DH,0AH,0DH,0AH,'$'
createmsg DB '* * * * * create error * * * * *',0DH,0AH,'$'
openmsg DB '* * * * * open error * * * * *',0DH,0AH,'$'
readmsg DB '* * * * * read error * * * * *',0DH,0AH,'$'
writemsg DB '* * * * * write error * * * * *',0DH,0AH,'$'
movemsg DB '* * * * * move error * * * * *',0DH,0AH,'$'
convertmsg DB 0DH,0AH,0DH,0AH,0DH,0AH,'* * * * * convert victory * * * * *',0DH,0AH,'$'
dest DW 0
shifang DW 0
.CODE
BEGIN PROC FAR
MOV AX,@DATA
MOV DS,AX
MOV ES,AX
LEA DX,input
WRITE
FINIT
FNSTCW dest ;置控制寄存器RC位為11
OR dest,0000110000000000B
FLDCW dest
;------------------------------------------------------------
LEA DX,buf
MOV AH,10
INT 21H
MOV CX,4
LEA DI,spathname
LEA SI,buf+2
A1: CMP CX,3
JE C1
CMP CX,2
JE D1
CMP CX,1
JE E1
HAA Q
C1: LEA DI,ppathname
HAA T
D1: LEA DI,m
HBB
JMP B1
E1: LEA DI,n
HBB
JMP A2
B1: DEC CX
K8: INC SI
CMP BYTE PTR [SI],20H
JE K8
JMP A1
;-----------------------------------------------------------------
A2: FILD m
FIDIV n
FSTP sf
CALL openh
LEA DX,bmp
MOV CX,54
CALL readh
LEA DI,bmp
ADD DI,18
MOV EAX,DWORD PTR [DI]
MOV swidth,EAX
ADD DI,4
MOV EAX,DWORD PTR [DI]
MOV sheight,EAX
FLD sf
FIMUL swidth
FISTP outwidth
FLD sf
FIMUL sheight
FISTP outheight
MOV CX,4
MOV EAX,swidth
MOV EDX,0
DIV CX
CMP DX,0
JE K1
SUB CX,DX
MOV sbbyte,CL
JMP K2
K1: MOV sbbyte,0
K2: MOV EAX,swidth
MOV CX,3
MUL CX
MOV EDX,0
MOV DL,sbbyte
ADD EAX,EDX
MOV srowlength,EAX
MOV CX,4
MOV EAX,outwidth
MOV EDX,0
DIV CX
CMP DX,0
JE K3
SUB CX,DX
MOV pbbyte,CL
JMP K4
K3: MOV pbbyte,0
K4: LEA DI,bmp
ADD DI,18
MOV EAX,outwidth
MOV DWORD PTR [DI],EAX
ADD DI,4
MOV EAX,outheight
MOV DWORD PTR [DI],EAX
MOV EAX,outwidth
MOV CX,3
MUL CX
MOV EDX,0
MOV DL,pbbyte
ADD EAX,EDX
MOV prowlength,EAX
MOV ECX,outheight
MUL ECX
ADD EAX,54
LEA DI,bmp
ADD DI,2
MOV DWORD PTR [DI],EAX
CALL createh
LEA DX,bmp
MOV CX,54
CALL writeh
;--------------------------------------------------
A3: MOV EAX,outheight
CMP j,EAX
JAE A5
FILD j
FDIV sf
FIST y1
FISUB y1
FSTP v
LEA DI,bdata
MOV i,0
B3: MOV EAX,outwidth
CMP i,EAX
JAE C3
FILD i
FDIV sf
FIST x1
FISUB x1
FSTP u
MOV AX,x1
INC AX
MOV x2,AX
MOV AX,y1
INC AX
MOV y2,AX
Rx1y1
Rx1y2
LEA SI,T1T2
LEA BX,T3T4
MOV CX,3
A4: MOV AL,[SI]
MOV AH,0
MOV p1,AX ;(x1,y1)
MOV AL,3[SI]
MOV AH,0
MOV p2,AX ;(x2,y1)
MOV AL,[BX]
MOV AH,0
MOV p3,AX ;(x1,y2)
MOV AL,3[BX]
MOV AH,0
MOV p4,AX ;(x2,y2)
FILD p2
FISUB p1
FMUL u
FIADD p1
FSTP f1
FILD P1
FIADD p4
FISUB p2
FISUB p3
FMUL u
FMUL v
FILD p3
FISUB p1
FMUL v
FADD ST(0),ST(1)
FADD f1
FISTP ppixel
FISTP shifang
MOV AX,ppixel
MOV [DI],AL
INC DI
INC BX
INC SI
DEC CX
CMP CX,0
JNE A4
INC i
JMP B3
C3: LEA DX,bdata
MOV ECX,prowlength
CALL writeh
INC j
JMP A3
A5: MOV AH,3EH
MOV BX,handle
INT 21H
MOV AH,3EH
MOV BX,phandle
INT 21H
LEA DX,convertmsg
WRITE
FINIT
MOV AH,4CH
INT 21H
BEGIN ENDP
;----------------------------------------------------------------------
;子函數
openh PROC NEAR
LEA DX,spathname
MOV AX,3D00H
INT 21H
JC S1
MOV handle,AX
RET
S1: LEA DX,openmsg
WRITE
MOV AH,4CH
INT 21H
RET
openh ENDP
movepoint PROC NEAR
MOV AX,4200H
MOV BX,handle
INT 21H
JC S2
RET
S2: LEA DX,movemsg
WRITE
MOV AH,4CH
INT 21H
RET
movepoint ENDP
readh PROC NEAR
MOV AH,3FH
MOV BX,handle
INT 21H
JC S3
RET
S3: LEA DX,readmsg
WRITE
MOV AH,4CH
INT 21H
RET
readh ENDP
writeh PROC NEAR
MOV AH,40H
MOV BX,phandle
INT 21H
JC S4
RET
S4: LEA DX,writemsg
WRITE
MOV AH,4CH
INT 21H
RET
writeh ENDP
createh PROC NEAR
MOV AH,3CH
MOV CX,0
LEA DX,ppathname
INT 21H
JC S5
MOV phandle,AX
RET
S5: LEA DX,createmsg
WRITE
MOV AH,4CH
INT 21H
RET
createh ENDP
;----------------------------------------------------------------------
END BEGIN
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -