80X86学习笔记源程序组织

1.顺序结构

cpu在顺序执行程序片时,按照指令先后次序执行指令,因此在顺序程序中,指令先后次序至关重要。

例:将一字节压缩BCD转换为两个ASCII码

DATA SEGMENT

BC_BUF DB 96H

ASC_BUF DB 2 DUP(?)

DATA ENDS

CODE SEGEMENT

    ASSUME CS: CODE, DS: DATA

START:   MOV AX, DATA

                MOV DS, AX

                MOV AL, BCD_BUF

                MOV BL, AL

                MOV CL, 4

                SHR AL, CL

                ADD AL, 30H

                MOV ASC_BUF, AL

                AND BL, 0FH

                ADD BL, 30H

                MOV ASC_BUF + 1, BL

CODE ENDS

END START

例:把一个16进制数字码转换为对应7段代码程序。

XLAT:该指令寄存器BX内容作为表(每项一个字节)的首地址,把寄存器AL值作为下标,取出表项内容,内容再送AL寄存器,也就是把寄存器AL中的内容转换为表中对应项的值。表最大为256项。

DSEG SEGMENT

TAB DB 1000000B, 1111001B, 0100100B, 0110000B

        DB 0011001B, 0010010B, 0000010B, 1111000B

        DB 0000000B, 0010000B, 0001000B, 0000011B

        DB 1000110B, 0100001B, 0000110B, 0001110B

XCODE DB 8

YCODE DB ?

DSEG ENDS

CSEG SEGMENT

ASSUME CS: DSEG, DS: DSEG

START: MOV AX, DSEG

MOV DS, AX

MOV  BX, OFFSET TAB

MOV AL, XCODE

AND AL, 0FH

XLAT

MOV YCODE, AL

MOV AH, 4CH

INT 21H

CSEG ENDS

END START

例:利用直接查表法编程完成将内存单元TAB首地址开始存放0~15的平方数表,求出A单元给定数(<=15)的平方值送B单元保存。

DATA SEGMENT

TAB DB 0,1,4,9,16,25,36,49,65,81,100,121,144,169,196,225

A DB 12

B DB ?

DATA ENDS

CODE SEGMENT

ASSUME CS: CODE, DS: DATA

START: MOV AX, DATA

MOV DS, AX

MOV BX, OFFSET TAB

MOV AL, A

XLAT

MOV B, AL

CODE ENDS

END START

2.分支结构

在汇编语言中,一般利用条件测试指令和条件转移指令等实现简单的分支。

例:比较两个无符号数的大小,把大数存入MAX单元

DATA SEGMENT

SOURCE DB X1, X2

MAX DB ?

DATA ENDS

CODE SEGMENT

ASSUME CS: CODE, DS: DATA

MOV AX, DATA

MOV DS, AX

MOV AL, SOURCE

CMP AL, SOURCE+1

JNC ONE   ;若没借位

MOV AL, SOURCE+1

ONE: MOV MAX, AL

CODE ENDS

END

例:由大到小排列三个数

DATAS SEGMENT

BUFFER DB 87, 234, 123

DATAS ENDS

CODES SEGMENT

ASSUME CS: CODES, DS: DATAS

START: MOV AX, DATAS

MOV DS, AX

MOV SI, OFFSET BUFFER

MOV AL, [SI]

MOV BL,  [SI+1]

MOV CL,, [SI+2]

CMP AL, BL

JAE NEXT1

XCHG AL, BL

NEXT1: CMP AL, CL

JAE NEXT2

XCHG AL, CL

NEXT2: CMP BL, CL

JAE NEXT3

XCHG BL, CL

NEXT3: MOV [SI], AL

MOV [SI+1], BL

MOV [SI+2], CL

INT 21H

CODES ENDS

END START

3.循环结构

循环通常由四部分组成:

(1)初始化部分

(2)循环体部分

(3)调整部分

(4)控制部分

例:在字符数组里找出第一个非0数据,并显示输出其所在数组的下标

DATA SEGMENT

ARRAY DB 0,0,016,0,88,66,0,44,33,99

COUNT  EQU $-ARRAY

DATA ENDS

CODE SEGMENT

      ASSUME CS:CODE, DS:DATA

START:MOV AX, DATA

             MOV DS, AX

             MOV CX, COUNT

            MOV DI, –1

AGAIN:

              INC DI

              CMP ARRAY[DI], 0

              LOOPZ AGAIN

              MOV DX, DI

              OR DL, 30H  ;转换为ascii

DISPLAY:

                MOV AH, 02H

                INT 21H

                MOV AH, 4CH

                INT 21H

CODE ENDS

            END START

例:把字符串所有大写字母改为小写字母,设字符串以结尾。

DATA SEGMENT

STR DB ‘HOW are u !’, 0

DATA ENDS

CODE SEGMENT

           ASSUME CS:CODE, DS: DATA

START:

             MOV AX, DATA

             MOV DS, AX

             MOV SI, OFFSET STR

AGAIN:

              MOV AL, [SI]

              OR AL, AL   ;测试是否为0

              JZ OK

              CMP AL, ‘A’

              JB NEXT

              CMP AL, ‘Z’

              JA NEXT

              OR AL, 20H       ;加20H

NEXT:

             INC SI

             NMP AGAIN

OK:

             MOV AX, 4C00H

              INT 21H

CODE ENDS

END START

原文地址:https://www.cnblogs.com/seebro/p/2437897.html