汇编语言程序基本结构

  小编最近学习汇编语言,特此记录一下。(8086CPU)

  注意事项:

  * 首先记录一下,al为8位寄存器。当我们命令当中调用 AL时,CPU会默认为8位寄存器,他和AX是相互独立的两个寄存器。即产生的仅为不会存到AH里面去。

  * 设定段寄存器的伪指令。汇编时,系统自动将代码段的段地址送到CS,到那时如果定义了数据段,附加段,堆栈段,就需要用指令将DS,SS,ES初始化。小编             就是因为最初没有初始化,造成了结果错误的现象。

DATA SEGMENT 'DATA'
    X DB 93H
ENDS
CODE SEGMENT 'CODE'
    START:
    MOV AX,00C5H
    MOV BL,X
    ADD AL,BL
    ENDS
     END START

  上述结果AX中的内容位0058H。最后产生的高位会进入标志位,不会到AH里面。

顺序结构

  顺序结构是最常见的,最基本的数据结构。就是顺次执行的。

  下面为编写计算 S = A * B - C,的程序,ABC都为无符号字节变量,S为字类型的变量。

DATA SEGMENT 'DATA'
    A DB 38
    B DB 54
    C DB 16
    S DW ?
    DATA ENDS

CODE SEGMENT 'CODE'
    ASSUME CS:CODE,DS:DATA
    START:MOV AX,DATA
    MOV AL,A
    MOV BL,B
    MUL BL
    MOV BL,C
    MOV BH,0
    SUB AX,BX
    MOV S,AX
    MOV AH,4CH
    INT 21H
    CODE ENDS
END START

  我们在编写一个S = 86H * 34H - 21H的程序,式中的三个均为无符号数。

  涉及到三个数的运算,并且题中没有给定相应的变量,所以只需一个定义字节类型的变量来标识存放三个数的地址。

DATA SEGMENT 'DATA'
    NUM DB 86H,34H,21H
    RESULT DW 0
DATA ENDS
CODE SEGMENT 'CODE'
    ASSUME CS:CODE,DS:DATA
    START:
    MOV AX,DATA
    MOV DS,AX
    LEA SI,NUM
    LEA DI,RESULT
    MOV AL,[SI]
    MOV BL,[SI+1]
    MUL BL
    MOV BL,[SI+2]
    MOV BH,0
    SUB AX,BX
    MOV [DI],AX
    MOV AH,4CH
    INT 21H
CODE ENDS
END START

  内存自TABLE开始的连续16个内存单元存放着0~15的平方值,查看表中任意数X的平方值,并将结果放在RESULT中。

DESG SEGMENT
    TABLE DB 0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225
    DATA DB 3
    RESULT DB 0
 DESG ENDS
SSEG SEGMENT STACK 'STACK'
    DB 100 DUP(0)
SSEG ENDS
CSEG SEGMENT
    ASSUME CS:SSEG,DS:DESG
    BEGIN: MOV AX,DESG
    MOV DS,AX
    MOV AX,SSEG 
    MOV SS,AX
    LEA BX,TABLE
    MOV AH,0
    MOV AL,DATA
    ADD BX,AX
    MOV AL,[BX]
    MOV RESULT,AL
    MOV AH,4CH
    INT 21H
CSEG ENDS
END BEGIN

在汇编中XLAT指令的作用就是在bx保存array的首地址,AL保存array的位置的基础上,执行XLAT指令,将返回值送入AL指令中.

  指令如下指令后AL=5

   lea    bx,array

    mov    al,1

    xlat        ;返回值AL=array[AL]
我们运用XLAT指令在处理上面的问题就简单多了:

DATA SEGMENT 'DATA'
TABLE DB 0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225
    RESULT DB 0
    X DB 11 
DATA ENDS
STACK SEGMENT 'STACK'
    DW 100H DUP(0)
    STACK ENDS
CODE SEGMENT 'CODE'
    ASSUME CS:CODE,DS:DATA,SS:STACK
    START:MOV AX,DATA
    MOV DS,AX
   LEA BX,TABLE
   MOV AL,X
   XLAT
   MOV CL,AL
    MOV AH,4CH
    INT 21H
CODE ENDS
END START

  分支程序:

根据不同的条件进行不同的跳转。像if-then结构。

  下面展示:在提示信息“please input character:”,后面输入字符,若输入ESC,则结束运行;若输入的是小写字母则显示;若大写字母则转换为小写显示。

DATA SEGMENT 'DATA'
    MESSAGE DB 'Please input character:' ,0DH,0AH,'$'
DATA ENDS
STACK SEGMENT 'STACK'
    DW 100H DUP(0)
    STACK ENDS
CODE SEGMENT 'CODE'
    ASSUME CS:CODE,DS:DATA,SS:STACK
    START:MOV AX,DATA
    MOV DS,AX
    AGAIN:MOV DX,OFFSET MESSAGE
    MOV AH,9
    INT 21H
    MOV AH,1
    INT 21H
    CMP AL,1BH ;IS ESC. JUMP TO EXIT
    JZ EXIT
    CMP AL,5BH
    JC LOW0
    CMP AL,7BH
    JC LOW1
    JMP AGAIN
  LOW0: 
    CMP AL,40H
    JC AGAIN 
    ADD AL,20H
  LOW1:
    CMP AL,60H
    JC AGAIN
    MOV AH,2
    MOV DL,AL
    INT 21H
    MOV DL,0AH
    INT 21H
    JMP AGAIN
  EXIT:MOV AH,4CH
    INT 21H
CODE ENDS
END START

  循环结构:

当程序中碰到多次重复执行的程序时i,就可以利用循环结构来实现。

  在数据段BUFF中开始存放的100个字节类型的无符号整数,编写程序找出其中最大的数并存放到MAX单元中。

DATA SEGMENT 'DATA'
    BUFF DB 100 DUP(0)
    MAX DB 0
DATA ENDS

CODE SEGMENT 'CODE'
    ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
      MOV DS,AX
      MOV CX,99
      LEA SI,BUFF
      MOV AL,[SI]
      INC SI
CON:  CMP AL,[SI]
      JNC NEXT
      MOV AL,[SI]
NEXT: INC SI
      LOOP CON
      MOV MAX,AL
      MOV AH,4CH
      INT 21H
CODE ENDS
END START

  过程设计:

  子过程(过程)是程序的一部分,完成特定功能的程序段。使用的时候要注意一下三点:

  1 参数的传递。需要有传入参数和传出参数。参数的传递可以通过寄存器,变量,地址表,堆栈

  2 相应寄存器的内容保护。

  3 子程序还可以调用别的子程序,称为子程序的嵌套。

类似与高级语言的函数。但是也有不同的地方,高级语言中的参数都是形参,是临时分配内存单元的,调用之后就会注销,将返回值输出。而汇编中相当于参数的直接调用,因此需要注意参数的保护,可以将保护的参数进行压栈操作。

  proc是子程序定义伪指令, far是该子程序的属性,决定调用程序和子程序是否在同一代码段
如下:为子程序定义及说明,

子程序名 PROC NEAR ( 或 FAR )
xxxxxx具体代码
ret
子程序名 ENDP

  调用平方和实现20个数的平方和:

DATA SEGMENT 'DATA'
    CON EQU 20
    SUM DW 0
DATA ENDS
CODE SEGMENT 'CODE'
    ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
       MOV DS,AX
       MOV CX,CON
       CALL GO
       MOV SUM,DX
       MOV AX,4C00H
       INT 21H

GO    PROC NEAR
    MOV DX,0
    MOV BL,1
    MOV AL,BL
CC: MUL BL
    ADD DX,AX
    INC BL
    MOV AL,BL
    LOOP CC
    RET
GO  ENDP
CODE ENDS
END START

 

posted @ 2020-04-01 23:01  为红颜  阅读(1453)  评论(0编辑  收藏  举报