问两个ASM文件的写法
程序中,对应DisplayHexDigit的子程序是:AL_ASCII,对应DisplayHexByte的子程序是:ByteD_ASCII。
本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
CR equ 000DH
LF equ 000AH
KBBack equ 0008H
-----------------------------------------
功能:显示指定地址(Str_Addr)的字符串
入口:
Str_Addr=字符串地址(要求在数据段)
用法: Output Str_Addr
用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
-----------------------------------------
功能:显示输出一个字符
入口:dl=要显示的字符
Output_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
Output_Chr endp
-----------------------------------------
功能:输出回车换行
Output_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
Output_CTLF endp
-----------------------------------------
功能:取光标位置
入口:无
出口:DH=行号,DL=列号
GetCursor Proc Near
PUSH AX
PUSH BX
PUSH CX
XOR BX,BX
MOV AH,3
INT 10H
MOV Cursor_Row,DH
MOV Cursor_Col,DL
POP CX
POP BX
POP AX
RET
Cursor_Row DB ?
Cursor_Col DB ?
GetCursor EndP
-----------------------------------------
功能:置光标位置
入口:Cursor_Row=行坐标Cursor_Col: 列坐标)
SetCursor Proc Near
PUSH CX
PUSH BX
PUSH AX
MOV DH,Cursor_Row
MOV DL,Cursor_Col
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
RET
SetCursor EndP
-----------------------------------------
功能:将AL中的低4位二进制数转换成十六进制显示的ASCII码
入口:AL
出口:AL=转换后的ASCII码
AL_ASCII Proc Near
cmp al,10 AL<10?
jb @@To_ASCII AL<10,按数字处理
add al,7 AL>=10,按大写字母处理
@@To_ASCII: add al,'0' 转换成相应的数字或大写字母
ret
AL_ASCII EndP
-----------------------------------------
功能:将AL中的字节数据转换成十六进制显示的ASCII码
入口:AL
出口:AX=转换后的ASCII码
Byte_ASCII Proc Near
push cx
mov cx,4
xor ah,ah 将AH置0
shl ax,cl 将AX左移4位
shr al,cl 将AL右移4位
xchg ah,al
call AL_ASCII 调用子程序,将AL中的值转换成相应的ASCII码
xchg ah,al
call AL_ASCII
xchg ah,al
pop cx
ret
Byte_ASCII EndP
-----------------------------------------
功能:将AL中的字节数据转换成十六进制显示的ASCII码,并在当前光标位置显示
入口:AL
出口:AX=转换后的ASCII码
ByteD_ASCII Proc Near
push dx
push ax
call Byte_ASCII 将AL中的字节数转换成十六进制显示的ASCII码
cmp al,'9'
jbe $+7
mov dl,'0'
call Output_Chr 显示一个字符
mov dl,al
call Output_Chr 显示一个字符
mov dl,ah
call Output_Chr 显示一个字符
mov dl,'H'
call Output_Chr 显示一个字符
pop ax
pop dx
ret
ByteD_ASCII EndP
-----------------------------------------
功能:键盘输入一个N位的十进制数字,将其转换成二进制数并保存在指定的内存单元。
入口:N=数字位数;di=保存输入的数字首地址
出口:转换后的二进制数保存在di所指的单元
Input_Digit Proc Near
push dx
push cx
push bx
push di
lea di,@@Save_Tmp
push di
cld
mov cx,N
push cx
@@Input: call GetCursor 取光标位置
mov ah,1 从键盘接受一个字符
int 21h
cmp al,CR 若键入的是回车,已经键入的数字不足N位
jz @@ASC_Dec 转去处理已经键入的数字
cmp al,KBBack
jz @@KB_Back 若是回空键,重新输入
cmp al,'0'
jb @@KBBack 若低于数字'0',重新输入
cmp al,'9'
ja @@KBBack 若低于数字'9',重新输入
jmp @@Save_Dig
@@KB_Back: dec Cursor_Col
inc cx
dec di
@@KBBack: call SetCursor 置光标位置
jmp @@Input
@@Save_Dig: and al,0fh 转换成二进制数
stosb 保存
loop @@Input 接受下一个数字
@@ASC_Dec: mov ax,cx
pop cx
pop si
sub cx,ax 实际输入的数字位数
xor bp,bp
xor dx,dx
xor ax,ax
jcxz @@Save_Ret 若直接回车,没有输入任何数字,按输入'0'处理
dec cx 实际输入的数字位数减1,准备把输入的这一串数字转换成二进制数
jcxz @@One_Digit 若输入的数字只有一位,转去直接保存这个二进制数
mov bx,10
@@Mul_Ten: lodsb
cbw
add ax,bp
mul bx
mov bp,ax
loop @@Mul_Ten
@@One_Digit:lodsb
cbw
add ax,bp
@@Save_Ret: pop di
stosb
pop bx
pop cx
pop dx
ret
@@Save_Tmp db 16 dup(?)
Input_Digit EndP
-----------------------------------------
N equ 3 输入数字的位数
Prompt_Str1 db 'Please input a number(0-15): $'
Prompt_Str2 db 'Please input a number(0-255): $'
Number db ? 保存输入的数据
Press_Key db 13,10,13,10,'Press any key to exit...$'
Start: push cs
pop ds
push cs
pop es
Output Prompt_Str1 提示输入数字
lea di,Number 数字保存地址
call Input_Digit 输入数字
call Output_CTLF 输出一个回车、换行
call Output_CTLF 输出一个回车、换行
mov al,Number
call AL_ASCII 将AL中的低4位二进制数转换成十六进制显示的ASCII码
mov dl,al
call Output_Chr 显示输出一个字符
Output Press_Key 提示按任意键继续
mov ah,1
int 21h
call Output_CTLF 输出一个回车、换行
call Output_CTLF 输出一个回车、换行
Output Prompt_Str2 提示输入数字
lea di,Number 数字保存地址
call Input_Digit 输入数字
call Output_CTLF 输出一个回车、换行
call Output_CTLF 输出一个回车、换行
mov al,Number
call ByteD_ASCII 将AL中的字节数据转换成十六进制显示的ASCII码,并在当前光标位置显示
Output Press_Key 提示按任意键继续
mov ah,1
int 21h
Exit_Proc: mov ah,4ch 结束程序
int 21h
Code ENDS
END Start 编译到此结束
方法:1.第一个,也是最简单的,直接将字幕文件拖到视频当中。
2.将视频文件与字幕文件改成相同的名字(扩展名不变),然后放到同一个根目录下,打开视频就可以了。
3.用格式工厂工具,将二者融为一体。在视频软件的播放界面“点击右键——字幕——本地字幕”然后倒入你的字幕文件。
下面根据动漫花园wanghさん 的格式解释文作简单修改而得
Script Info
分辨率设置
PlayResX: 屏幕的宽度
PlayResY: 屏幕的高度
V4+ Styles 格式
Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColor, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Name 风格样式的名称
Fontname 所使用的字体的名称
Fontsize 字体大小
PrimaryColour 第一颜色
SecondaryColour 第二颜色
OutlineColor 边框颜色
BackColour 阴影颜色
Bold 粗体
Italic 斜体
Underline 下划线
Strikeout 删除线
-----------------------
参数
0关闭 -1开启
------------------------
ScaleX 横向缩放
ScaleY 纵向缩放
单位是%,默认为100,即正常大小
Spacing 字间距
Angle 旋转
为Z轴旋转
BorderStyle 边框样式
Outline 边框宽度
Shadow 阴影距离
Alignment 对齐方式
为键盘数字键位区
左 中 右
上 7 8 9
中 4 5 6
下 1 2 3
MarginL 字幕距左边的距离,右对齐时无效
MarginR 字幕距右边的距离,左对齐时无效
MarginV 字幕高度
下对齐时表示到底部的距离
上对齐时表示到顶部的距离
中对齐时无效
Encoding 字体编码 VISTA中 另有情况
Events
Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Layer 字幕层次
字幕重叠时数值大的显示在最靠近作者的那一层
Start 开始时间
格式0:00:00.00
最小单位1/100秒
End 结束时间
Style 应用V4+风格名称
Name 名字,相当于注释
MarginL
MarginR
MarginV
同 v4+ Styles
Effect
Scroll up<y1><y2><delay>[<XXdeawayheight>]
字幕从下向上移动
Scroll down<y1><y2><delay>[<XXdeawayheight>]
字幕从上向下移动
y1,y2 上下范围
delay 速度 表示移动一象素所用的时间,单位为1/1000秒
delay=5表示一秒移动200的距离
fadeawayheight 上下的淡出淡入范围
Banner<delay>[<lefttoright>[<XXdeawaywidth>]]
字幕横向移动
delay 速度
lefttoright <0/1>0从右向左移动,1从左向右移动
fadeawaywidth 左右的淡出淡入范围
---------------------------------------------------------------------------------------------
注:移动一般不用EFFECT 实现 看不大懂的可以忽略
---------------------------------------------------------------------------------------------
Text 字幕正文
字幕正文中可以添加代码来实现各种特效
ASS 标记代码
<参数>
[可选项]
<../..>任选其中一项
所有代码加{}表示,\n,\N,\h除外
所有代码由\开头
\n 空格,宽度超出范围后自动换行
\N 硬回车
\h 硬空格
\b<0/1>粗体
\i<0/1>斜体
\u<0/1>下划线
\s<0/1>删除线
参数意义 0关闭 1开启
\bord<width>边框宽度
\shad<depth>阴影距离
width和depth为自然数 0表示 无
\fn<font name>改变字型 所使用的字体名称
\fs<font size>改变字号 font size 为自然数
\fscx<percent>X轴缩放
\fscy<percent>Y轴缩放
正常大小为100%
\fsp<pixels>调整字间距 pixels为自然数
\frx<degrees>X轴旋转
\fry<degrees>Y轴旋转
\frz<degrees>Z轴旋转
\fr = \frz
在没有\org限制时 旋转所围绕的中心由\a或\an决定
\fe<charset>改变编码 charset 为对应编码的代号
\c&H<bbggrr>&改变颜色
十六进制00-ff 蓝绿红
\c = \1c
\1c&H<bbggrr>&改变第一颜色
\2c&H<bbggrr>&改变第二颜色
\3c&H<bbggrr>&改变边框颜色
\4c&H<bbggrr>&改变阴影颜色
\alpha&H<aa>&改变透明度
\alpha是同时改变字幕所有部分的透明度
\1a&H<aa>&改变第一颜色透明度
\2a&H<aa>&改变第二颜色透明度
\3a&H<aa>&改变边框颜色透明度
\4a&H<aa>&改变阴影颜色透明度
\r[<style>] \r 恢复成最初的字体
\r <style>可以改变成其它的字体
\an<alignment>设置对齐方式
左 中 右
上 7 8 9
中 4 5 6
下 1 2 3
根据情况使用 an影响到对齐 旋转 缩放 等等 所以需要完全理解an的意义 才能随意的使用其他代码
对齐方式是针对字幕的整体有效 字幕中的每个字符都是向下方对齐的 如果要使用不同大小的字符 应该将一段字幕分为多段时间轴相同的字幕
\k<duration>卡拉OK
\k 无平滑效果
\K或\kf 有平滑效果
\ko 边框的卡拉OK效果
时间单位是1/100秒
{\K50}aaaa表示用0.5秒来显示歌词aaaa
后面没有字符表示停顿一段时间
\t([<t1>, <t2>, ] [<accel>,] <style modifiers>) 动态效果
t1,t2分别是动态效果开始和结束时间,省略后以时间轴的开始结束时间为准
accel控制动态效果的运动速度 1 正常速度
0<accel<1 速度从快到慢减速运动
1<accel 速度从慢到快加速运动
计算公式为 t时的动作完成量 = pow((t-t1)/(t2-t1), accel)
style modifiers可以使用的效果 \c,\<1/2/3/4>c,\alpha,\<1/2/3/4>a,\fs,\fr[<x/y/z>],\fsc<x/y>,\fsp,\bord,\shad
可同时使用多个效果
\move(<x1>, <y1>, <x2>, <y2>[, <t1>, <t2>])
x1,y1为移动开始的位置
x2,y2为移动结束的位置
屏幕的确左上角是0,0,右下角由[Script Info]中的PlayResX:和PlayResY:决定
t1,t2是移动开始和结束时间,省略后以时间轴的开始结束时间为准
只能使用一次且对整体有效
\pos(<x>, <y>)
改变位置
只能使用一次且对整体有效
使用\move或\pos后MarginL,MarginR,MarginV无效
\fade(<a1>, <a2>, <a3>, <t1>, <t2>, <t3>, <t4>)
淡出淡入效果
a1是显示开始时的透明度,t1,t2表示显示的开始和结束时间
a2是显示结束到消失开始时的透明度
a3是消失结束时的透明度,t3,t4表示消失的开始和结束时间
此处透明度必须使用十进制来表示,范围0-255
\fad(<t1>, <t2>)
淡出淡入效果
t1表示显示使用的时间
t2表示消失使用的时间
时间单位为ms
\p<0/1/2...>绘图,参数1/2...表示绘图比例,0表示绘图结束
\p<1/2...><绘图命令>\p0 绘制图形,绘制出的图形作为一个字符来处理,可以近行旋转,缩放等
绘图命令:
m <x><y>移动到x,y并开始绘制
绘图开始时必须使用一次
n <x><y>移动到x,y并开始绘制,但不关闭上一个绘图
l <x><y>画直线到x,y
可以用l <x1><y2><x2><y2>... <xn><yn>的方式画连续直线
b <x1><y1><x2><y2><x3><y3>画曲线
s <x1><y1><x2><y2><x3><y3>... <xn><yn>画封闭曲线
p <x><y>延伸封闭曲线
c 关闭封闭曲线
绘制的图形是实心的,在前面添加\1a&Hff&可以得到空心的图形