📄 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 + -