AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > 汇编语言

汇编语言的艺术(组合语言的艺术)--基本认识(2)

51自学网 http://www.51zixue.net

四、对指令的认识

    指令就是「指挥」、「命令」,用以控制电脑,一步一步地实现程式的计划。
    组合语言的格式为:
    ( 下行中凡标“[ ] ”者,表有些指令可省略 )
    [前置元]   指令   [目的操作元,源始操作元]
  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这种无可奈何的高科技畸形儿。

<

 

 

 
上一篇:汇编语言的艺术(组合语言的艺术)--基本认识(3)  下一篇:汇编语言---程式设计&nbsp;(5)