您好,欢迎来电子发烧友网! ,新用户?[免费注册]

当前位置:电子发烧友网 > 图书频道 > 电子 > 《计算机组成原理与汇编语言》 > 第3章 指令系统与汇编语言设计

第12节 汇编语言举例

例1 二进制加法程序。

   两个多字节的二进制数分别放在以ADD1和ADD2为首地址的存贮单元中,两个数的字长度放在CONT单元中。最后相加结果放在以SUM为首地址的单元中。

  所有数的低字节在前,高字节在后。

         程序如下:

   DATA SEGNENT
   ADD1 DBFEH,86H,7CH,44H,56H,1FH
   ADD2 DB56H,49H,4EH,0FH,9CH,22HSUM DB 6DUP(0)
   CONT DB 3
   DATA ENDS
   STACK SEGMENT PARASTACK′STACK′
   DB 100DUP(?)
   STACK ENDS
   CODE SEGMENT
   ASSUME:CS:CODE,DS:DATA,ES:DATA,SS:STACK
   MADDB: MOV AX,DATA
   MOV DS,AX ;初始化数据段寄存器
   MOV ES,AX ;初始化辅助段寄存器
   MOV SI,OFFSETADD1;被加数地址→SI
   MOV DI,OFFSETADD2;加数地址→DI
   MOV BX,OFFSETSUM;和地址→BX
   MOV CL,BYTEPTRCONT
   MOV CH,0;初始化相加字长度
   CLCMADDB1:MOV AX,[SI]
   ADC AX,[DI] ;16位相加 
   INC SI
   INC SI
   INC DI
   INC DI
   MOV, [BX]AX ;相加结果送结果单元
   INC BX
   INC BX
   LOOP MADDB1 ;执行循环
   HLT
   CODE ENDS
   END MADDB

例2 两个未压缩的BCD数相加程序。

    在8088中可以对两个用ASCII码表示的十进制数直接相加,以得到它们的和。设被加数放在SBCD1为首地址的单元中,加数放在SBCD2为首地址的单元中。

   DATA SEGMENT
   SBCD1 DB′5′,′6′,′9′,′2′
   SBCD2 DB′2′,′3′,′7′,′8′
   SSUM DB 4DUP(0)
   CONT DB 4
   DATA ENDS
   STACK SEGMENT PARASTACK′STACK′
   DB 200DUP(?)STACK ENDS
   CODE SEGMENT
   ASSUMECS:CODE,DS:DATA,SS:STACK,ES:DATA
   SBCDAD:MOV AX,DATA
   MOV DS,AX
   MOV ES,AX
   CLC
   CLD
   MOV SI,OFFSETSBCD1
   MOV DI,OFFSETSBCD2
   MOV BX,OFFSETSSUMMOV CL,CONT
   MOV CH,0
   SBCDAD1:LODS SBCD1
   ADC AL[DI], ;加法运算
   AAA
   INC DI
   MOV BYTEPTR,AL
   INC BX
   LOOP SBCDAD1
   HLT
   CODE ENDS
   END SBCDAD
例3 二进制整数乘法程序。

    两个二进制整数相乘,每个数的字长度放在CONT中,被乘数放在DATA1为首地址的存贮单元中,乘数放在DATA2为首地址的存贮单元中,乘积放在DATA3为
          
   首地址的存贮单元中。

      程序如下:

   DATA SEGMENT
   DATA1 DW 403EH,1F51H
   DATA2 DW 10F5H,111EH
   DATA3 DW 4DUP(0)
   CONT DW 2
   DATA ENDS
   STACK SEGMENTPARASTACK′STACK′
   DB 100 DUP(?)
   STACK ENDS
   CODE SEGMENT
   ASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACK
   MUL: MOV AX,DATA
   MOV DS,AX
   MOV ES,AX
   MOV SI,OFFSETDATA1
   MOV DI,OFFSETDATA2
   MOV BX,OFFSETDATA3
   MOV CX,CONT
   CLD
   MUL1:PUSH CX
   MOV DX,[SI]
   INC SIINC SI
   PUSH BX
   PUSH DI
   MOV CX,CONT
   MUL2:PUSH CX
   PUSH DX
   MOV AX,[DI]
   INC DI
   INC DI
   MUL DX
   ADD,AX[DI]
   INC BX
   INC BX
   ADC,DXPOP DX
   POP CX
   LOOP MUL2
   POP DI
   POP BX
   INC BX
   INC BX
   POP CX
   LOOP MUL1
   HLT
   CODE ENDS
   END MUL

例4 二进制数转换成ASCII码程序。

     编制程序,将一个字长的二进制数转换成一个ASCII码表示的字符串。二进制数放在BINNUM中,其转换结果放ASCBCD中。

      程序如下:

   DATA SEGMENT
   BINNUM DW 4FFFH
   ASCBCD DB 5 DUP(0)
   DATA ENDS
   STACKSEGMENTPARASTACK′STACK′
   DB 200DUP(?)
   STACK ENDS
   CODE SEGMENT
   ASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACK
   BINASC:MOV AX,DATA
   MOV DS,AX
   MOV ES,AX
   MOV CX,5
   XOR DX,DX
   MOV AX,BINNUM
   MOV BX,10
   MOV DI,OFFSETASCBCDBINASC1: DIV BX
   ADD DL,30H
   MOV [DI],DL
   INC DI
   AND AX,AX
   JZ STOP
   MOV DL,0
   LOOP BINASC1
   STOP: HLT
   CODE ENDS
   END BINASC
例5 ASCII码转换成二进制数的程序

    将一个4位ASCII码数字转换成二进制数,ASCII码数字放在以ASCSTG为首地址的内存单元中(共有4位),转换结果放入以BIN为首地址的内存单元中。

          程序如下:

   DATA SEGMENT
   ASCSTG DB′5′,′A′,′6′,′1′
   BIN DB2DUP(0)
   DATA ENDS
   STACK SEGMENTPARASTACK′STACK′
   DB 100 DUP(?)
   STACK ENDS
   CODE SEGMENT
   ASSUMECS:CODE,DS:DATA,SS:STACK
   ASCB: MOV AX,DATA
   MOV DS,AX
   MOV CL,4
   MOV CH,CL
   MOV SI,OFFSETASCSTG
   CLD
   XOR AX,AX
   XOR DX,DX
   ASCB1: LODS ASCSTG
   AND AL,7FH
   CMP AL,′0′
   JL ERROR
   CMP AL,′9′
   JG ASCB2
   SUB AL,30H
   JMP SHORTASCB3ASCB2: CMP AL,′A′
   JL ERROR
   CMP AL,′F′
   JG ERROR
   SUB AL,37H
   ASCB3: OR DL,AL
   ROR DX,CL
   DEC CH
   JNZ ASCB1MOV WORD PTR BIN,DX
   HLT
   CODE ENDS 
   END ASCB
   
例6 输入一行字符的输入程序。

     一般从终端可送入80个字符,再加一个回车符共81个,程序在回车符后另加1个换行符,因此放在缓冲区内的字符实际为82个。现假设接口的接收寄存器地址为52H,
      
    发送寄存器为53H,状态寄存器为54H,并且状态寄存器b-0=1时为发送就绪,b -1=1时为接收就绪。在接收数据时要进行偶校验,如发现有错则转错误处理。若输入
      
    字符超过80个字符,则输出缓冲区溢出信息。

   程序如下:

   DATA SEGSEGMENT
   MESSAGE DB′BUFFEROVERFLOW′,0DH,0AH
   DATAS EGENDS
   COMSEG SEGMENT
   BUFFER DB 82DUP(?)
   COUNT DW?
   COMSEG ENDS
   …CODE SEGMENT
   INREG EQU 52H
   OUTREG EQU 53H
   STATUS EQU 54H
   RRDY EQU 00000010B
   TRDY EQU 00000001B
   … ASSUMEDS:DATASEG,ES:COMSEG
   MOV AX,DATASEG
   MOV DS,AX
   MOV AX,COMSEG
   MOV ES,AX
   …INPUT80 PROC NEAR
   PUSH DI
   PUSH SI
   PUSH AX
   PUSH CX
   MOV DI,OFFSETBUFFER
   MOV COUNT,DI
   MOV CX,81
   CLDNEXTIN:IN AL,STATUS
   TEST AL,RRDY
   JZ NEXTIN
   IN AL,INREG
   OR AL,0
   JPE NOERROR
   JMP NEAR PTR ERROR
   NOERROR:AND AL,7FH
   STOSB
   CMP AL,0DH
   LOOPNE NEXTINJNE OVERFLOW
   MOV AL,0AH
   STOSB
   SUB DI,COUNT
   MOV COUNT,DI
   …POP CX
   POP AX
   POP SI
   POP DIRET
   OVERFLOW:MOV SI,OFFSETMESSAGE
   MOV CX,17
   NEXTOUT: IN ALSTATUS
   TEST AL,TRDY
   JZ NEXTOUT
   LODSB
   OUT OUTREG,AL
   LOOP NEXTOUT
    …POP CX
   POP AX
   POP SI
   POP DI
   RET
   INPUT80 ENDP