简述HTML文件的基本结构

简述HTML文件的基本结构,第1张

HTML(HyperText Mark-up Language,超文本标记语言或超文本链接标示语言),是目前网络上应用最为广泛的语言,也是构成网页文档的主要语言。HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字、图形、动画、声音、表格、链接等。HTML的结高铅山构包括头部(Head)、主体(Body)两大部分,其中头部描述浏览器所需的信息,而主体则包含所要说明的具体激禅内容。

HTML文档基本结构

在HTML网页文档的基本结构戚中中主要包含以下几种标记。

1.HTML文件标记

和标记放在网页文档的最外层,表示这对标记间的内容是HTML文档。放在文件开头,放在文件结尾,在这两个标记中间嵌套其他标记。

2.HEAD文件头部标记

文件头用和标记,该标记出现在文件的起始部分。标记内的内容不在浏览器中显示,主要用来说明文件的有关信息,如文件标题、作者、编写时间、搜索引擎可用的关键词等。

在HEAD标记内最常用的标记是网页主题标记,即TITLE标记,它的格式为:

你先判断一下你的文件,visio有没有关联,看图标一般就看出来了,右击这个文件属性,看看它的打培培举开方式是什么,然后再解决问题。

如果是有关联,打不开,先在开始程序里找到visio打开,然后把这个文件拖进去,看可不可以打开呢,如果不能,可能是你的文件损坏了,你新建一配碧中腔个文件,试试,看可不可以打开。

如果没有关联,也找一下有没有visio这个程序,如果没有的话,那你需要安装的,这个不在office那个套件里的。

Hume/冷雨飘心

对于习惯于C的灵活多变的数据类型和方便的计算那些人而言,了解底层的浮点运算似乎没有什么意义吵好,现在Visual盛行的时代还有多少人关心那些所谓的底层呢?

对了AfOs来说,浮点运算是编程中很重要的一部分,因为我们可能会山蚂面临一些稍微复杂的运算逗碰埋,如果你和我一样是Die-hard的asm拥护者,不想轻易用C来解决问题,你肯定能想像在asm下用整数运算求sin(2.3)的痛苦,实际上,微机早就为我们准备了解决之道:那就是浮点运算.但现在关于浮点运算的资料较少,相信很多人和我一样还不掌握这种强有力的技术,那好,我们一起来学习学习.

(一)浮点数

(This Part mainly Froe Bill's Article)

在这之前,先来看几个术语:

FPU->Floating Point Unit,浮点运算部件

BCD->Binary Coded Decimal 压缩的二十进制数,是用4个位来表示数字0~9,一个byte表示两个十进制数,比如01111001表示89

科学计数法:这是科学的~~~~具体含义查查初中还是小学的数学课本 D:)

浮点运算使用三种不同的数据:

1)整数(Integer),又分为字,短整数(Short Integer)和长整数(Long Integer)

2)实数(Real)分单精度(Single Real)和双精度(Double Real)

3)压缩的二十进制数(BCD)

下面是其位数(bits)和能表示的大致范围和

TypeLength Range

-----------------------------------------------

Word Integer16 bit -32768 to 32768

Short Integer 32 bit -2.14e9 to 2.14e9

Long Integer64 bit -9.22e18 to 9.22e18

Single Real32 bit 1.18e-38 to 3.40e38

Double Real64 bit 2.23e-308 to 1.79e308

extended Real 80 bit 3.37e-1932 to 1.18e4932

Packed BCD 80 bit -1e18 to 1e18

双精度数和扩展精度数表示范围对一般应用来说已经足够大了!

1)整数,以补码形式存储,正数的补码是其本身,负数补码是其绝对值的各位变反后加1,下面是实际存储的例子:

0024var1 dw 24

FFFEvar2 dw -2

000004D2var3 dd 1234

FFFFFF85var4 dd -123

0000000000002694var5 dq 9876

FFFFFFFFFFFFFEBFvar6 dq -321

2)BCD数

在FPU中用80位表示正好是浮点堆寄存器的宽度,在其格式如下存储:

Bit

79___72_71________________________________________0

符号---18个二十进制数--------

看下面的例子:

00000000000000012345var1 dt12345

80000000000000000100var2 dt-100

3)浮点数,这个复杂点,有三种格式

单精度:_31_30________23_22___________0

符号指数有效数

双精度:_63_62__________52_51__________________0

符号指数有效数

扩展精度数:

_79_78____________64_63___________________0

符号指数 有效数

例子:

C377999Avar1 dd -247.6

40000000var2 dd 2.0

486F4200var3 real4 2.45e+5

4059100000000000var4 dq 100.25

3F543BF727136A40var5 real8 0.00123

C377999Avar1 dd -247.6

40000000var2 dd 2.0

486F4200var3 real4 2.45e+5

4059100000000000var4 dq 100.25

3F543BF727136A40var5 real8 0.001235

400487F34D6A161E4F76var6 real10 33.9876

DD和real4都可以在asm中来定义单精度浮点数,4 bytes

DQ和real8都可以在asm中来定义双精度浮点数,8 bytes

DT和real10都可以在asm中来定义扩展精度浮点数,10 bytes

(二)浮点部件

FPU从功能上分为两个部分:控制单元和运算单元,控制单元主要面向CPU,而算数单元负责具体算数运算.

FPU即浮点部件包括8个通用寄存器,5个错误指针寄存器和三个控制寄存器.

1)8个通用寄存器每个80 bit,形成一个寄存器堆栈,所有的计算结果都保存在寄存器堆栈中,其中数据全部是80位的扩展精度格式,即使是BCD,整数,单精度和双精度等在装入寄存器的时候都要被FPU自动转化为80位的扩展精度格式,注意栈顶通常表示为ST(0),然后是ST(1)...ST(i),ST(i)是相对于栈顶而言的.

和堆栈很相似,只不过宽度为80bit,映像如下:

_______________________

|ST(0) |

|_______________________|

|ST(1) |

|_______________________|

|......|

|......|

|ST(i) |

|_______________________|

2)控制寄存器,FPU有三个控制寄存器:状态寄存器,控制寄存器和标记寄存器

状态寄存器->SW

_M_____D________10___9____8___7_________5_________________________0__

| B | C3| TOP| C2 | C1 | C0 | ES || PE | UE | OE | ZE | DE | IE |

|____|____|____|____|____|____|____|____|____|____|____|____|____|____|

B:浮点部件正忙

C0-C3 指示浮点运算的结果,不同指令有不同含义

TOP指示栈顶,通常是0

ES 以下任何位置位 (pe, ue, oe, ze, de, or ie) 则置位

PE 精度故障

UE 数字太小无法表示溢出

OE 现有精度无法表示,数字太大溢出

ZE 除0错

DE 指示至少有一个 *** 作数未规格化

IE 无效错误,指示堆栈上溢或下溢,无效 *** 作数等

控制寄存器:

_15____________10___9____8___7_________5______________________0__

| |IC | RC | PC || PM | UM | OM | ZM | DM | IM |

|____|____|____|___|__|_|__|__|____|____|____|____|____|____|____|

IC 无穷大控制,对486,已经无效

RC 舍入控制

00 = 朝最接近或者偶数舍入

01 = 朝负无穷大方向舍入

10 = 朝正无穷大方向舍入

11 = 超0方向截断

PC 精度控制

00 = 单精度

01 = 保留

10 = 双精度

11 = 扩展精度

PM~IM 屏蔽状态寄存器低5位指示的错误.为1则屏蔽.

标记寄存器:

每2 bit表示一个对应堆栈寄存器的状态,具体含义如下:

15________________________________________3_____0

|Tag7 |...................................|tag1|

|_____|___________________________________|____|

含义:

00 = 有效

01 = 零

10 = 无效或无穷大

11 = 为空

(三)浮点指令系统及MASM下浮点程序设计

事实上最重要和比较难于找到资料在(一)和(二)部分中已经介绍,下面是为了完整性的考虑,如果你是第一次接触浮点指令,看看下面的摘要也无妨.另外本文未涉及到的一个方面是关于浮点处理异常的情况,因为涉及到保护模式和中断、任务切换以及SEH等较多内容,我相信介绍之后只会令人更加迷惑,况且我现在似乎也无法把这几个问题完全说清除,一般我们几乎不需要知道这些.让我们先来看主要内容.

关于浮点程序设计是一个大的话题,我只是提纲挈领地简述Masm32V7(/V6)中的设计方法,因为486以上的CPU内建了浮点部件所以可以在程序里直接使用浮点指令.下面是一个小例子:

__MASMSTD equ1

.386p

.model flat, stdcall

option casemap :none case sensitive

include c:\\hd\\hd.h

include c:\\hd\\mac.h

--------------

.DATA

num1dq 12345

num2dq 98765

resdd 0

.DATA?

bufdb 200 dup(?)

-----------------------------------------

.CODE

__Start:

finit 初始化浮点部件

fildnum1装入num1

fildnum2装入num2

fmul执行乘法

fistres存储

invokewsprintf,addr buf,CTEXT("the result is: %ld"),res

invokeStdOut,addr buf 显示,注意是控制台显示,编译用/SUBSYSTEM:CONSOLE

invokeStdIn,addr buf,20

invokeExitProcess,0

END__Start

具体你要怎样运用指令,那就得看你自己所要进行的 *** 作和要执行的算法了.注意在fpu内部寄存器总是以扩展精度数来表示数值的,因此进行整数运算最后要用fist来存储,这样才能得到正确的结果,这些转换是由fpu自动完成的.

浮点指令系统分为五类:数据传送类、算术运算类、超越函数类、比较类、环境及系统控制类.

我并不想列出所有函数的参数以及用法,因为这会是劳动力的浪费.我打字用拼音的!:D)具体参考资料见文章最后,别的我就帮不上你了.

1)数据传送类,主要包括

这类指令主要是从内存装入浮点寄存器堆数据,一般目的地址总是栈顶ST(0),用调试器你可以清除的看到这一点.注意带P结尾的 *** 作,是在前面 *** 作完成之后出栈,也就是原来ST(1)的内容现在成了ST(0)的内容,注意到这一点,你可以方便地设计出灵活多变的程序.

装入:

FLDPush real onto stack

FILDConvert two's complement integer to real and push

FBLDConvert BCD to real and push to stack

存储:

FSTStore floating-point number from stack

FSTPConvert top of stack to integer

FIST

FISTPConvert top of stack to integer

FBSTPStore BCD to integer and pop stack

交换:

FXCHExchange top two stack elements

常数装载:

FLD1装入常数1.0

FLDZ装入常数0.0

FLDPI装入常数pi (=3.1415926....精度足够,放心使用)

FLDL2E装入常数log(2)e

FLDL2T装入常数log(2)10

FLDLG2装入常数log(10)2

FLDLN2装入常数Log(e)2

我逼并不想列出所有的浮点指令的详细格式,因为没有必要!很多资料都有这些指令格式的介绍,浮点指令均以F开头,LD表示Load,ILD表示整数的Load,BLD是二十进制数的Load,这样记起来就很容易了,很多指令功能都可以根据指令一眼看出来.

2)算术运算类

加法:

FADD/FADDPAdd/add and pop

FIADDInteger add

减法:

FSUB/FSUBPSubtract/subtract and pop

FSUBR/FSUBRPSubtract/subtract and pop with reversed operands

FISUBInteger subtract

FISUBRInteger subtract/subtract with reversed operands

乘法:

FMUL/FMULPMultiply/multiply and pop

FIMULInteger multiply

除法:

FDIV/FDIVPDivide/divide and pop

FIDIVInteger divide

FDIVR/FDIVRPDivide/divide and pop with reversed operands

FIDIVRinteger divide with reversed operands

其他:

FABSCalculate absolute value

FCHSChange sign

FRNDINTRound to integer

FSQRTCalculate square root

FSCALEScale top of stack by power of 2

FXTRACTSeparate exponent and mantissa

FPREMCalculate partial remainder

FPREM1Calculate partial remainder in IEEE format

如果指令后面未带 *** 作数,其默认的 *** 作数为ST(0)和ST(1),关于带R后缀的指令是正常 *** 作数的顺序变反,比如fsub执行的是x-y,fsubr执行的就是y-x.

3)超越函数类

三角函数

FSINCalculate sine

FCOSCalculate cosine

FSINCOSCalculate quick sine and cosine

FPTANCalculate partial tangent

FPATANCalculate partial arctangent

Log类

FYL2XCalculate y times log base 2 of x

FYL2XP1Calculate y times log base 2 of (x+1)

F2XM1Calculate (2^x)-1

4)比较类

FCOMCompare

FCOMPCompare and pop

FICOMInteger compare

FTSTInteger compare and pop

FUCOMUnordered compare

FUCOMPUnordered compare and pop

FXAMSet condition code bits for value at top of stack

FSTSWStore status word

会根据结果设置,C0~C3,在上面并未就C0~C3进行具体介绍,C1是用来判断上溢或者下溢的,C0相当于EFLAGS里面的CF,作用也基本一致,C2相当于PF,C3相当于ZF,你可能会看到如下指令

FSTSW ax

SAHF

JZ label

为什么如此呢,因为用如上指令将状态字存入EFLAGS,C0正好置于CF位,C3正好置于ZF位.

5)环境及系统控制类

FLDCWLoad control word

FSTCWStore control word

FSTSWStore status word

FLDENVLoad environment block

FSTENVStore environment block

FSAVESave coprocessor state

FRSTORRestore coprocessor state

FINITInitialize coprocessor

FCLEXClear exception flags

FINCSTPIncrement stack pointer

FDECSTPDecrement stack pointer

FFREEMark element as free

FNOPNo operation

FWAITWait until floating-point instruction complete

我实在不想罗嗦了,因为这些指令的格式以及用法在Masm32V7的help目录下面的fphelp.hlp文件中有详细的说明,当然也还有很多其他的指令格式列表,我之所以列出来是为了完整性.这里还有一个比较困难的问题就是浮点数的显示,windows没有现成的函数调用,wsprintf只能显示整数,但有好多库支持,比如LYB主页上的浮点开发包,当然等你搞熟了这些东西,也可以自己写.

关于浮点程序的调试,建议使用Softice,因为Trw不支持浮点堆栈的显示,现在网上有一个fpu插件,可以部分解决问题,不过不够好用.一切看你自己的选择了.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12257509.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存