本帖最后由 嵌入式.h 于 2017-9-6 14:52 编辑
[Asm] 纯文本查看 复制代码 ASSUME CS:HIKE, DS:DATA; 假设代码段,数据段
DATA SEGMENT;数据段开始
DB 'HiKeRy';defined byte 定义6个字节型字符数据ASCII码对应数:72,105,75,101,82,121 hex:48H,69H,4BH,65H,52H,79H
DB 'www.52pojie.cn';defined byte 定义14个字节字符数据ASCII码对应数hex:77,77,77,2E,35,32,70,6F,6A,69,65,2E,63,6E,
DATA ENDS;数据段结束
HIKE SEGMENT;代码段开始
GO:MOV AX,DATA;将数据段送入寄存器中、
MOV DS,AX;设置ds指向DATA数据段
MOV BX,0;设置偏移地址为0,我们常用bx寄存器来存放偏移地址
MOV CX,6;循环6次、等下我们要将HiKeRy全部转换成小写字母、cx寄存器存放循环的次数
DO: MOV AL,[BX];将DS:[BX]的字节数据放入AL(低8位寄存器)
OR AL,00100000B;将AL的数据和00100000相或、OR指令: 位与位相或、都为0才为0、其他都为1
MOV [BX],AL;把处理后的数据放回内存中、
INC BX;偏移地址自增1、类似高级语言的(i++)
LOOP DO;CX-1、 跳到do标记地址处继续执行程序、cx为0则向下执行
MOV CX,5;设置循环次数5次、这次我们要[url=http://www.52pojie.cn]www.52pojie.cn[/url]中的pojie转成大写
ADD BX,6;把偏移地址定位到p这个ASCII码的内存单元
ONLY:MOV AL,[BX];数据送入交换寄存器
AND AL,11011111B;这次转换用的是逻辑与、与逻辑或、逻辑相反、位与为相与、都为1才为1、其他都为0
MOV [BX],AL ;再把处理后的数据放会内存
INC BX;偏移地址再增1
LOOP ONLY;又要循环了……
MOV AX,4C00H;上面的工作完成了、程序返回。
INT 21H;
HIKE ENDS;代码段结束了
END GO;程序结束了、我们去编译、debug调试看看
编译后、debug 我们的程序先看看我们定义在内存中的CSCII码
继续调试
*********************************************************************************************
DIV指令
[Asm] 纯文本查看 复制代码 ASSUME CS:HIKE, DS:DATA;演示代码-我们只需要假设一个代码段和一个数据段就好了
DATA SEGMENT;数据段开始
DD 03e8h ; defined double word 开辟一个双字形数据空间里面存放1000(十进制)、16进制为03e8“被除数32bit”
DW 100 ; defined word 字形数据100(十进制)16进制为64“除数16bit”
DW 0;defined word 定义一个字形数据空间、用来存放结果
DATA ENDS;数据段结束
HIKE SEGMENT;代码段开始
GO:MOV AX,DATA;把数据段放到ax寄存器中、GO:为程序的入口标志(程序从这里开始执行)
MOV DS,AX; 把数据段放入段寄存器中
MOV AX,DS:[0];把一个word(字形数据)放入ax(16位寄存器)、所以这里取的是两个内存单元数据(ds:[0] ds:[1])\被除数的低16位
MOV DX,DS:[2];把高16位放入dx寄存器中、《被除数为32位所以要用两个16位寄存器存放、ax存放低16位、dx放高16位》
DIV WORD PTR DS:[4];除以数100、word ptr:数据长度
MOV DS:[6],AX;把结果放入内存中
MOV AX,4C00H;程序返回
INT 21H
HIKE ENDS ;代码段结束
END GO ;程序结束
debug调试:
|