例1
DATA SEGMENT
BLOCK DW 0ABCDH ;字型变量BLOCK,赋值0ABCDH
BUFF DD ? ;从BUFF偏移地址开始,为一个双字型数据保留了4个字节的内存单元
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA ;AX寄存器储存DATA首地址
MOV DS,AX ;段寄存器DS储存DATA首地址
MOV DX,BLOCK ;DX储存变量BLOCK DX是ABCDH
MOV AX,DX ;AX储存ABCDH
AND AX,0F0FH ;与运算,AX储存0B0DH
AND DX,0F0F0H ;DX储存A0C0H
MOV CL,4 ;CX计数器的地位储存4
SHR DX,CL ;DX逻辑右移4位 空位补0 DX储存0A0CH
LEA BX,BUFF ;加载变量BUFF的首地址 到BX-双字型4字节
MOV [BX+0],AL ;AX低8位-1字节 0DH
MOV [BX+1],DL ;DX低8位-1字节 OCH
MOV [BX+2],AH ;AX高8位 0BH
MOV [BX+3],DH ;DX高8位 0AH
MOV AX,4C00H ;中断进入系统调动 DOS功能
INT 21H
CODE ENDS
END START
例2 判断MEMS单元数据,将结果存入MEMD单元。若数据>0,结果为1;若数据<0,结果为-1;若数据=0,结果为0.
DATA SEGMENT
MEMS DB 08H ;字节型变量MEMS
MEMD DB ? ;字节型变量MEMD
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
MOV AL,MEMS ;取数据判断 AL=0BH--1个字节
CMP AL,0 ;AL和0比较
JGE NEXT ;大于等于0,跳到NEXT
MOV AL,-1 ;上边不符合,小于0时,-1存入AL
JMP DONE ;跳到DONE
NEXT:
JE DONE ;等于0,跳转到DONE
MOV AL,1 ;1存入AL
DONE:
MOV MEMD,AL ;AL存入MEMD
MOV AX,4C00H ;DOS功能号
INT 21H
CODE ENDS
END START
例3 统计BUFF缓冲区数据中负数的个数.
DATA SEGMENT
BUFF DB 67H,9EH,-6AH,0ABH,6DH ;
MEM DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV CX,5 ;控制循环次数--数字的总个数
LEA BX,BUFF ;设置缓冲区指针
MOV DL,0 ;统计计数器清零--统计负数的个数
NEXT:
MOV AL,[BX] ;取出第一个数据放在AL--67H
CMP AL,0 ;作比较
JNS AA1 ;不是负数,转移到AA1
INC DL ;负数,统计值+1
AA1:
INC BX ;因为字节+1 移动指针
LOOP NEXT ;循环
MOV MEM,DL ;负数个数存在MEM
MOV AX,4C00H
INT 21H
CODE ENDS
END START
例4 统计AX寄存器中‘1’的个数
CODE SEGMENT
ASSUME CS:CODE
START:
MOV CX,16 ;循环次数16 --AX寄存器存16位
XOR DL,DL ;清零
CMP AX,0 ;AX是0吗
JZ DONE ;是0,16位没有数字1,结束循环
BB1:
SHL AX,1 ;不是0,逻辑左移1位,移出的位置放在CF
ADC DL,0 ;统计‘1’个数 ADC=ADD+CF
LOOP BB1
DONE:
MOV AX,4C00H
INT 21H
CODE ENDS
END START
例5 在BLOCK内存区中有一串字符,统计‘%’之前的字符个数
DATA SEGMENT
BLOCK DB 'ANDEP01395WR'
COUNT ENQ $-BLOCK ;当前位置对应偏移地址 统计字符串8位数据长度
MEM DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV SI,OFFSET BLOCK ;相当于LEA SI,BLOCK
MOV CX,COUNT ;次数放在COUNT中
LOOP1:
MOV AL,[SI] ;取字符
CMP AL,'%'
JZ DONE ;是‘%’ 结束循环
INC BYTE PTR MEM ;不是‘%’ 统计值+1
INC SI ;指针+1
LOOP LOOP1
DONE:
MOV AX,4C00H
INT 21H
CODE ENDS
END START
例6 用子程序结构实现寄存器AX内容乘10,结果仍在AX中.
CCC EQU 1000
CODE SEGMENT
ASSUME CS:CODE
START:
MOV AX,CCC ;AX赋值为1000 十六进制03E8H
CALL MUL10 ;调用子程序
;子程序
MUL10 PROC ;乘10子程序 入口参数AX,出口参数AX
PUSHF ;保护现场 保护标志寄存器和BX
PUSH BX
;10*AX->AX
ADD AX,AX ;2XX->AX
MOV BX,AX ;2XX->BX
ADD AX,AX ;4XX->AX
ADD AX,AX ;8XX->AX
ADD AX,BX ;8XX+2XX->AX
POP BX ;恢复现场
POPF
RET ;返回主程序
MUL10 ENDP
CODE ENDS
END START