建材秒知道
登录
建材号 > 链条 > 正文

问两个ASM文件的写法

忧郁的音响
从容的钢笔
2023-01-26 01:02:16

问两个ASM文件的写法

最佳答案
长情的柠檬
多情的春天
2026-05-08 21:27:42

程序中,对应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 编译到此结束

最新回答
隐形的画板
甜蜜的野狼
2026-05-08 21:27:42

方法:1.第一个,也是最简单的,直接将字幕文件拖到视频当中。

2.将视频文件与字幕文件改成相同的名字(扩展名不变),然后放到同一个根目录下,打开视频就可以了。

3.用格式工厂工具,将二者融为一体。在视频软件的播放界面“点击右键——字幕——本地字幕”然后倒入你的字幕文件。

喜悦的衬衫
忧伤的香水
2026-05-08 21:27:42

下面根据动漫花园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&可以得到空心的图形