小编最近学习汇编语言,特此记录一下。(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
循环结构:
当程序中碰到多次重复执行的程序时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