汇编语言程序基本结构
Posted a-runner
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编语言程序基本结构相关的知识,希望对你有一定的参考价值。
小编最近学习汇编语言,特此记录一下。(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
以上是关于汇编语言程序基本结构的主要内容,如果未能解决你的问题,请参考以下文章