程序1:
CODE SEGMENT ;段定义伪指令
ASSUME CS:CODE ;段约定伪指令
START:MOV DL,1 ;数据传送指令,源操作数立即寻址,目的操作数寄存器寻址,不影响6个状态标志
ADD DL,2 ;二进制数加法指令,源操作数立即寻址,目的操作数寄存器寻址,影响6个状态标志
ADD DL,30H ;二进制数加法指令,源操作数立即寻址,目的操作数寄存器寻址,影响6个状态标志
MOV AH,02H ;DOS功能调用,02H显示一个字符,入口参数DL=待显示字符的ASCII码(该操作会影响AL中的内容)
INT 21H ;DOS功能调用中使用此指令执行功能调用
MOV AH,4CH ;DOS功能调用,结束正在运行的程序,并返回DOS系统
INT 21H ;DOS功能调用中使用此指令执行功能调用
CODE ENDS
END START ;汇编结束伪指令
程序2:
立即寻址:(源操作数都是立即寻址)
MOV AL,11100101B
MOV BX,1234H
MOV CX,0A234H
MOV AH,-2 ;存入后,编译为补码
MOV BL,'A' ;编译后,BL=41H
MOV AX,11*12
寄存器寻址:(目的操作数为寄存器寻址)
MOV EAX,12345678H
MOV CH,CL
INC SI
直接寻址:
MOV AL,DS:[45H] ;源操作数为直接寻址,目标操作数为寄存器寻址
MOV AX,ES:[1000H] ;源操作数为直接寻址,目标操作数为寄存器寻址
MOV AX,DS:BUF ;源操作数为直接寻址,目标操作数为寄存器寻址,BUF为变量名
MOV AX,BUF ;源操作数为直接寻址,目标操作数为寄存器寻址,BUF为变量名
寄存器间接寻址:
MOV AH,DS:[BX/SI/DI] ;源操作数为寄存器间接寻址,目标操作数为寄存器寻址,“DS:“可省略
MOV AH,SS:[BP] ;源操作数为寄存器间接寻址,目标操作数为寄存器寻址,“SS:“可省略
基址寻址:
MOV AH,DS:[BX/BP+3] ;源操作数为基址寻址,目标操作数为寄存器寻址,“DS:“可省略
变址寻址:
MOV AH,SS:[SI/DI+3] ;源操作数为变址寻址,目标操作数为寄存器寻址
基址加变址寻址:
MOV AH,[BX/BP+SI/DI+1] ;源操作数为基址加变址寻址,目标操作数为寄存器寻址。若默认的段寄存器不一致,虽然组合在语法上是合法的,但易出错
程序3:
关系运算符:
EQ(相等)、NE(不等)、GT(大于)、LT(小于)、GE(大于等于)、LE(小于等于)
数据回送运算符:
(1)
MOV AX,SEG DATA ;SEG DATA返回DATA的段基址,因此源操作数为立即寻址,由于逻辑段段名本身就蕴含了段基址信息,所以SEG可以省略
MOV DS,AX
(2)
BUF DB 10H,20H,30H
MOV BX,OFFSET BUF ;OFFSEG BUF返回BUF的偏移地址,源操作数为立即寻址
MOV AH,[BX+1] ;执行完毕后,(AH)=20H,源操作数为间接寻址
(3)
BUF DW 20DUP(?)
MOV AH,SIZE BUF ;返回BUF所占字节数,因为使用DW双字定义,因此(AH)=40H
(4)
BUF DB 'HELLO,NJUPT'
COUNT EQU $-BUF ;$返回当前汇编地址计数器的值,此处COUNT为11
程序4:
PTR运算符:修改存储器操作数,使源目操作数类型一致
NUM DB,10H,20H,30H
MOV NUM,1234H 改为:MOV WORD PTR NUM,1234H ;目标操作数为存储器操作数,因此需要指定类型
NUMX DB 0FFH,00H
INC NUMX ;立即寻址,不用指定
使用原则:
双操作数 1.源目操作数不可同时为内存操作数;2.源目操作数必须长度一致 3.目的操作数为变址、间址、基址、基址加变址的内存操作数,而源操作数为单/双字节立即数,则必须使用PTR说明类型
单操作数:若操作数为间址寻址、变址寻址、基址寻址、基址加变址寻址方式,则必须说明类型
符号定义伪指令:
COUNT EQU 40H
MOV CX,COUNT ;一旦使用EQU传值后,COUNT的值不可再改变
COUNT=40H
MOV CX,COUNT
COUNT=30H ;COUNT的值可以再次定义
交换指令
XCHG AX,[BX] ;将间址寻址[BX]和寄存器寻址AX中的数据进行互换
程序5:
程序6:
程序7:
程序8:
程序9:
程序10:
程序11:
程序12:
程序13:
程序14:
;加法程序实现46H+52H,并将运算结果放入数据段变量SUM中
.586 ;处理器选择伪指令
DATA SEGMENT USE16 ;段定义伪指令
SUM DB ?
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA;段约定伪指令
BEG: MOV AX,DATA
MOV DS,AX
MOV AL,46H
ADD AL,52H
MOV SUM,AL
MOV AH,4CH ;DOS功能调用,结束正在运行的程序,并返回DOS操作系统
INT 21H ;执行功能调用
CODE ENDS
END CODE
程序15:
;可执行文件为.COM格式的条件为:
;1.源程序只使用一个逻辑段
;2.代码段目标块小于64KB
;3.启动指令放于离代码段偏移100H的单元,可以使用ORG 100H进行指定初始位置。
.586
CODE SEGMENT USE16
ASSUME CS:CODE
ORG 100H
BEG: JMP START
SUM DB ?
START: MOV AL,46H
ADD AL,52H
MOV SUM,AL
MOV AH,4CH
INT 21H
CODE ENDS
END BEG
程序16:
;询问用户姓名并等待用户输入,用户输入姓名后按回车键,程序再把输入的姓名复制显示在屏幕上
.586
DATA SEGMENT USE16
MESG DB "What is your name?"
BUF DB 30
DB ?
DB 30 DUP(?)
DATA ENDS
CODE SEGEMENT USE16
ASSUME CS:CODE,DS:DATA
BEG: MOV AX,DATA
MOV DS,AX
AGAIN: MOV AH,9
MOV DS,OFFSET MESG
INT 21H
MOV AH,0AH
MOV DX,OFFSET BUF
INT 21H
MOV AH,2
MOV DL,0AH
INT 21H
MOV BL,BUF+1
MOV BH,0
MOV SI,OFFSET BUF+2
MOV BYTE PTR [BX+SI],'$'
MOV AH,9
MOV DX,OFFSET BUF+2
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END BEG
程序17:
;在屏幕左上角显示黑底灰白字符串‘HELLO’,并在屏幕中央显示红底白字字符串‘WELCOME’
.586
DATA SEGMENT USE16
MESG1 DB 'HELLO$'
MESG2 DB 'WELCOME'
LL EQU $-MESG2
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG: MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,0003H ;AH=00H,AL=03H,即设为80*25彩色
INT 10H ;BIOS输出功能的调用
MOV AH,9
MOV DX,OFFSET MESG1 ;显示黑底白字字符串“HELLO”
INT 21H
MOV AX,1301H
MOV BH,0
MOV BL,01001111B
MOV CX,LL
MOV DH,12
MOV DL,(80-LL)/2
MOV BP,OFFSET MESG2
INT 10H
MOV AH,4CH
INT 21H
CODE ENDS
END BEG
程序18:
;比较变量A1和A2两个有符号数的大小,并将其中较大的数寄放在AL中
.586
DATA SEGMENT USE16
A1 DB -12
A2 DB -80
DATA ENDS
CODE SEGMENT USE16
ASSUME DS:DATA,CS:CODE
BEG: MOV AX,DATA
MOV DS,AX
MOV AL,A1
CMP AL,A2
JGE NEXT
MOV AL,A2
NEXT: MOV AH,4CH
INT 21H
CODE ENDS
END BEG
程序19:
;某科室9人,统计月收入在2000~4000间的人数,并用十进制显示统计结果
,586
DATA SEGMENT USE16
NUM DW 1000,2222,3333,4444,2344,5667,2332,1999,4567
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG: MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET NUM
MOV CX,9
MOV DL,0
LAST: CMP WORD PTR [BX],2000
JC NEXT
CMP WORD PTR [BX],4000
JA NEXT
INC DL
NEXT: INC BX
INC BX
LOOP LAST
ADD DL,30H
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END BEG
程序20:
;计算1+2+……+100,并将结果存入字变量SUM中
.586
DATA SEGMENT USE16
SUM DW ?
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG: MOV AX,DATA
MOV DS,AX
MOV CX,100
MOV AX,0
AGA: ADD AX,CX
LOOP AGA
MOV SUM,AX
MOV AH,4CH
INT 21H
CODE ENDS
END BEG
程序21
;将字符串STRING中的所有大写字母转换为小写字母,并设该字符串以0结尾
.586
DATA SEGMENT USE16
STRING DB 'I AM A STUDENT',0
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG: MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET STRING
LAST: MOV AL,[BX]
CMP AL,0
JZ EXIT
CMP AL,'A'
JC NEXT
CMP AL,'Z'
JA NEXT
OR AL,20H
MOV [BX],AL
NET: INC BX
JMP LAST
EXIT: MOV AH,4CH
INT 21H
CODE ENDS
END BEG
程序22:寄存器传递参数
;设ARRAY是5个字元素的数组,用子程序计算数组元素的累加和,不记进位,并将结果存入变量RESULT中
.585
DATA SEGMENT USE16
ARRAY DW 11111H,22222H,33333H,44444H,55555H
RESULT DW ?
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG: MOV AX,DATA
MOV DS,AX
MOV CX,5
MOV BX,OFFSET ARRAY
CALL COMPUTE
XYZ: MOV RESULT,AX
EXIT: MOV AH,4CH
INT 21H
COMUPTE PROC
MOV AX,0
AGA: ADD AX,[BX]
ADD BX,2
LOOP AGA
RET
COMUPTE ENDP
CODE ENDS
END BEG
程序23:新的代码结构实现上程序,内存单元传递参数
.585
DATA SEGMENT USE16
ARRAY DW 11111H,22222H,33333H,44444H,55555H
RESULT DW ?
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG: MOV AX,DATA
MOV DS,AX
CALL COMPUTE
EXIT: MOV AH,4CH
INT 21H
COMUPTE PROC
PUSH AX
PUSH BX
PUSH CX
MOV AX,0
MOV BX,OFFSET ARRAY
MOV CX,5
AGA: ADD AX,[BX]
ADD BX,2
LOOP AGA
MOV RESULT,AX
POP CX
POP BX
POP AX
RET
COMUPTE ENDP
CODE ENDS
END BEG
程序24:新的代码结构实现上程序,堆栈传递参数
.585
DATA SEGMENT USE16
ARRAY DW 11111H,22222H,33333H,44444H,55555H
RESULT DW ?
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG: MOV AX,DATA
MOV DS,AX
MOV CX,5
PUSH CX
MOV BX,OFFSET ARRAY
PUSH BX
CALL COMPUTE
ADD SP,4
MOV RESULT,AX
EXIT: MOV AH,4CH
INT 21H
COMUPTE PROC
PUSH BP
MOV BP,SP
PUSH BX
PUSH CX
MOV AX,0
MOV BX,[BP+4]
MOV CX,[BP+6]
AGA: ADD AX,[BX]
ADD BX,2
LOOP AGA
POP CX
POP BX
POP BP
RET
COMUPTE ENDP
CODE ENDS
END BEG
程序25:用宏指令实现显示彩色字符串
.586
DISP1 MACRO VAR
MOV AH,9
MOV DX,OFFSET VAR
INT 21H
ENDM
DISP2 MACRO Y,X,VAR,LENGTH,COLOR
MOV AH,13H
MOV AL,1
MOV BH,0
MOV BL,COLOR
MOV CX,LENGTH
MOV DH,Y
MOV DL,X
MOV BP,OFFSET VAR
INT 10H
DATA SEGMENT USE16
MESG1 DB 'HELLO$'
MESG2 DB 'WELCOME'
LL EQU $-MESG2
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG: MOV AX,DATA
MOV DS,AX
MOV AX,0003H
INT 10H
DISO1 MESG1
DISP2 12,(80-LL)/2,MESG2,LL,01001111B
MOV AH,4CH
INT 21H
CODE ENDS
END BEG
程序26:LOCAL伪指令的应用
.586
ABS MACRO VAR
LOCAL NEXT
CMP VAR,0
JGE NEXT
NEG VAR
NEXT: ENDM
DATA SEGMENT USE16
NUM DB -1
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG: MOV AX,DATA
MOV DS,AX
MOV BX,-1030
ABS BX
ABS NUM
MOV AH,4CH
INT 21H
CODE ENDS
END BEG
程序27~30,见https://blog.csdn.net/qq_37865996/article/details/84190778最后一部分