汇编语言00C5H,汇编语言程序基本结构(示例代码)

小编最近学习汇编语言,特此记录一下。(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 DB38B DB54C DB16S 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,0SUB 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 DW0DATA 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,0SUB AX,BX

MOV [DI],AX

MOV AH,4CH

INT 21H

CODE ENDS

END START

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

DESG SEGMENT

TABLE DB0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225DATA DB3RESULT DB0DESG ENDS

SSEG SEGMENT STACK‘STACK‘DB100 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,0MOV 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 DB0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225RESULT DB0X DB11DATA 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,9INT 21H

MOV AH,1INT 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,2MOV DL,AL

INT 21H

MOV DL,0AH

INT 21H

JMP AGAIN

EXIT:MOV AH,4CH

INT 21H

CODE ENDS

END START

484edf305791122af0c9ff91f2aecffd.png

循环结构:

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

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

DATA SEGMENT ‘DATA‘BUFF DB100 DUP(0)

MAX DB0DATA ENDS

CODE SEGMENT‘CODE‘ASSUME CS:CODE,DS:DATA

START:MOV AX,DATA

MOV DS,AX

MOV CX,99LEA 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 EQU20SUM DW0DATA 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,0MOV BL,1MOV AL,BL

CC: MUL BL

ADD DX,AX

INC BL

MOV AL,BL

LOOP CC

RET

GO ENDP

CODE ENDS

END START

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值