四、对指令的认识
指令就是「指挥」、「命令」,用以控制电脑,一步一步地实现程式的计划。 组合语言的格式为: ( 下行中凡标“[ ] ”者,表有些指令可省略 ) [前置元] 指令 [目的操作元,源始操作元] 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扩展记忆。 0C800H段,为唯读记忆体,其内为硬盘控制程式。 0E000H段,1MB 的主机此处为 RAM,否则此段不能使用。 0F000H段,为唯读记忆区,其内为基本输出/入程式。
由上可知,整个系统的规划不尽理想,尤其受限于8088的CPU 原先错误的设计理念(段暂存器现为定址的16倍,即每进一,相当于地址增加16。在最初,如果不考虑与8080兼容,原可轻易地定为 256或更高倍。)所以,当要扩充记忆容量时,便产生了 EMS这种无可奈何的高科技畸形儿。 <  
1/2 1 2 下一页 尾页 |