汇编语言的艺术-基本认识(二)
2007-04-25 09:30:09 来源:WEB开发网四、对指令的认识
指令就是「指挥」、「命令」,用以控制电脑,一步一步地实现程式的计划。
组合语言的格式为:
( 下行中凡标“[ ] ”者,表有些指令可省略 )
[前置元] 指令 [目的操作元,源始操作元]
1,「前置元」:以下诸例即为前置元的用法。
11段名:表后面的操作元应属于此临时前置段。如:
MOV AX,CS:BUF1
12定义:表示其后缓冲器的临时定义。BYTE PTR表示以一个字元定义的资料; WORD PTR表双字元资料。
不论缓冲器的原定义为何,凡有前置元者,皆以临 时定义为准,如:
ADD BYTE PTR BUF1,CL
前置元除了定义缓冲器长度外,亦可表示距离,
JMP SHORT ABCD
2,指令:
11使用方法:
1-1 暂存器到暂存器,但限长度相同者。
MOV AH,BL ; 为字元
XCHG AX,BX ; 为二字元
1-2 暂存器到缓冲器,或缓冲器到暂存器。
OR BUF1,AX ; BUF1为缓冲器,WORD
ADD CL,BYTE PTR BUF1
1-3 数值与暂存器或缓冲器之间。
TEST DI,8000H
AND SI,0FFH
SUB BYTE PTR BUF1,3
★数值绝不可作为「目的」操作元
1-4 将记忆区的地址放在暂存器中,以传送该地址的内容,或传送变数以便间接调用资料。本法限用于源存器(SI)、终存器(DI)、栈用器(BP)及兼用器(BX)。如:
MOV AL,BYTE PTR [DI]
XOR [BP],DL
MOV AX,[DI][SI]
MOV AX,BUF1[DI]
JMP LAB1[BX]
1-5 执行指令本身,不需源始或目的操作元。
PUSH CS
POP DS
CALL ABCD
JMP ABCD
CLI
STD
LAHF
RET
1-6 执行计数者。
LOOP ABCD
REP MOVSB
SAL DL,CL
ROR AX,1
DEC BX
1-7 暂存器专用指令。
OUT DX,AL
MUL BUF1
DIV CX
STOSB
LODSW
1-8 条件执行者。
JNZ ABCD
JA ABCD
JCXZ ABCD
INT 10H
IRET
12应用功能可分为下列八项:
2-1 资料转移:1-1,1-2,1-3,1-4皆有可能。
2-2 旗号控制:1-5 涉及旗号者。
2-3 段址处理:1-1,1-2 项可能。
2-4 数学计算:视指令而定,上述各项皆可。
2-5 字串处理:1-6,1-7 项功能。
2-6 控制转换:1-5。
2-7 条件执行:1-8。
2-8 中断处理:1-8。
3,操作元:可分成暂存器、缓冲器及数值(Immediate Data)。其书写方式与习惯的由前到后正好相反,使用时要小心,其余细节请参看有关组合语言手册。
第二节 工作环境
一、系统空间
IBM PC的记忆区定址,是采用倒装方式 (Big Endian) ,即定址值系由大到小,不同于一般由小而大(Little Endian) 的定址常识。
不论当初如此设计的目的何在,这种与人的习惯相反的观念,给写作组合语言者带来极大的困扰。不仅初学者常莫明其妙,连我个人多年来一直与图形处理为伍,都感到汗颜。每次在处理图形时,一定要将原图画在纸上,对照参详,才能瞭解是怎么回事。
举例说,有个图形值在AX中,要写进 DI 所指记忆区位置中,写完以后,AX要向右移一位再继续写,直到CX=0。
这是一个非常简单,而且经常用到的动作,可是在使用「倒装定址」时,麻烦就来了。
假设AX值为4567H ,DI指向记忆区2000H ,倒装的放法,是先将AL的值放进2000H 的记忆单位中,再将AH放进2001H 的记忆单位里。如果从由小到大的定址观点来看,这就等于是在2000H 中放了一个十六位元的值6745H 。
这倒不打紧,因为再从记忆位址2000H 中放回 AX 时,仍然成为4567H 。问题是在作图时,一旦4567H 变成了6745H ,图形就左右颠倒了。补救的方法,是在放进记忆区之前,先将AH及AL交换,放完以后,再重新交换回来。说来不算大事,可是白白浪费了两个指令的时间及空间。对速度极关紧要的画图显示而言,要画几万个点,所累积的时间就不可小观了。
除此之外,在写程式时,对图形的效应要能掌握,才会有良好的成果,像这样每次转来转去,头都昏了,自然而然就失去了耐性。
现在,80386 CPU 问世了,且不谈效果,读者可以试想,把32位元的 12345678H转换成 78563412H要多少道手续?
这种痛苦的手续,也是美国人不愿意用组合语言的理由之一。在高阶语言中,有编译器代劳,问题好像不大。但对效率的要求而言,就得不偿失了。图形功能是当今及未来电脑的主流之一,由于当初设计者没有远见,导致无穷的后患。
问题尚不止于此,IBM PC/AT 的系统空间,在定址的理论上,可以有 1MB(暂时不必考虑记忆扩充及EMS 等问题),然而真正能提供作为程式执行的空间,却不足 600KB。
我们且看其系统空间的安排:
0000H 段 0000H-007FH 计 128字元,为32个基本中断。
0008H 段 0000H-0380H 计 896字元,供系统管理中断。
0040H 段 0000H-00FFH 计 256字元,为基本程式资料。
0054H 段 0000H-9C00H 约 34K字元,DOS 程式占用。
唯有在 00E1H段-09000H段的前半是使用者可以控制的空间,其后,又被系统占用:
09000H段由0A000H附近直到0FFFFH,为DOS 所用。
0A000H段,为 VGA图形显示区。
0A800H段,为 EGA图形显示区。
0B000H段,为文字态缓冲区,萤幕处理器6845自动管理。
0B800H段,为图形态显示区,萤幕处理器6845自动管理。
0C000H段,至0D000H段,各机种不定,供 EMS扩展记忆。
更多精彩
赞助商链接