四、对指令的认识
指令就是「指挥」、「命令」,用以控制电脑,一步一步地实现程式的计划。 组合语言的格式为: (下行中凡标“[]”者,表有些指令可省略) [前置元]指令[目的操作元,源始操作元] 逆@风@者 1,「前置元」:以下诸例即为前置元的用法。 11段名:表后面的操作元应属于此临时前置段。如: MOVAX,CS:BUF1 12定义:表示其后缓冲器的临时定义。BYTEPTR表示以一个字元定义的资料;WORDPTR表双字元资料。 不论缓冲器的原定义为何,凡有前置元者,皆以临时定义为准,如: ADDBYTEPTRBUF1,CL 前置元除了定义缓冲器长度外,亦可表示距离, JMPSHORTABCD
2,指令: 11使用方法: 1-1暂存器到暂存器,但限长度相同者。 MOVAH,BL;为字元 XCHGAX,BX;为二字元 1-2暂存器到缓冲器,或缓冲器到暂存器。 ORBUF1,AX;BUF1为缓冲器,WORD ADDCL,BYTEPTRBUF1 1-3数值与暂存器或缓冲器之间。 TESTDI,8000H ANDSI,0FFH SUBBYTEPTRBUF1,3 ★数值绝不可作为「目的」操作元 1-4将记忆区的地址放在暂存器中,以传送该地址的内容,或传送变数以便间接调用资料。本法限用于源存器(SI)、终存器(DI)、栈用器(BP)及兼用器(BX)。如: MOVAL,BYTEPTR[DI] XOR[BP],DL MOVAX,[DI][SI] MOVAX,BUF1[DI] JMPLAB1[BX] 1-5执行指令本身,不需源始或目的操作元。 PUSHCS POPDS CALLABCD JMPABCD CLI STD LAHF RET 1-6执行计数者。 LOOPABCD REPMOVSB SALDL,CL RORAX,1 DECBX 1-7暂存器专用指令。 OUTDX,AL MULBUF1 DIVCX STOSB LODSW 1-8条件执行者。 JNZABCD JAABCD JCXZABCD INT10H 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,操作元:可分成暂存器、缓冲器及数值(ImmediateData)。其书写方式与习惯的由前到后正好相反,使用时要小心,其余细节请参看有关组合语言手册。
第二节工作环境
一、系统空间
IBMPC的记忆区定址,是采用倒装方式(BigEndian),即定址值系由大到小,不同于一般由小而大(LittleEndian)的定址常识。 不论当初如此设计的目的何在,这种与人的习惯相反的观念,给写作组合语言者带来极大的困扰。不仅初学者常莫明其妙,连我个人多年来一直与图形处理为伍,都感到汗颜。每次在处理图形时,一定要将原图画在纸上,对照参详,才能瞭解是怎么回事。 举例说,有个图形值在AX中,要写进DI所指记忆区位置中,写完以后,AX要向右移一位再继续写,直到CX=0。 这是一个非常简单,而且经常用到的动作,可是在使用「倒装定址」时,麻烦就来了。 假设AX值为4567H,DI指向记忆区2000H,倒装的放法,是先将AL的值放进2000H的记忆单位中,再将AH放进2001H的记忆单位里。如果从由小到大的定址观点来看,这就等于是在2000H中放了一个十六位元的值6745H。 这倒不打紧,因为再从记忆位址2000H中放回AX时,仍然成为4567H。问题是在作图时,一旦4567H变成了6745H,图形就左右颠倒了。补救的方法,是在放进记忆区之前,先将AH及AL交换,放完以后,再重新交换回来。说来不算大事,可是白白浪费了两个指令的时间及空间。对速度极关紧要的画图显示而言,要画几万个点,所累积的时间就不可小观了。 除此之外,在写程式时,对图形的效应要能掌握,才会有良好的成果,像这样每次转来转去,头都昏了,自然而然就失去了耐性。 现在,80386CPU问世了,且不谈效果,读者可以试想,把32位元的12345678H转换成78563412H要多少道手续? 这种痛苦的手续,也是美国人不愿意用组合语言的理由之一。在高阶语言中,有编译器代劳,问题好像不大。但对效率的要求而言,就得不偿失了。图形功能是当今及未来电脑的主流之一,由于当初设计者没有远见,导致无穷的后患。
本文章更多内容:1 - 2 - 下一页>> |