汇编语言安装指南
第一步:在github上下载汇编语言的安装包
网址:GitHub - HaiPenglai/bilibili_assembly: B站-汇编语言-pdf、代码、环境等资料B站-汇编语言-pdf、代码、环境等资料. Contribute to HaiPenglai/bilibili_assembly development by creating an account on GitHub.https://github.com/HaiPenglai/bilibili_assembly
第二步:解压汇编语言的安装包
然后回到解压问价夹------> 复制MASM文件
当然这个时候窗口有点小需要我们手动修改一些文件做处理
右击鼠标,找到文件的起始位置,复制文件起始位置的路径,不要复制到引号
复制起始位置到电脑的文件搜索栏中搜索【搜索出如下的页面显示】
修改文件窗口的大小
双击打开文件后文件显示出如下的的文本【修改文本中相关参数改变汇编模拟器的窗口大小】
修改output参数,将output的参数改为ddraw
参数修改完毕后继续打开汇编模拟器,会发小窗口的大小发生改变
【mount c f:\masm 含义是将c挂载到f盘的masm】
【c: 表示进入编译环境】
【dir 表示查看当前环境下有哪些文件】
下一步:写入debug,是一个编译所用的环境汇编语言的编程是在debug上面进行的
汇编:mov,add,sub 指令
进入汇编指令控制面板
#if 0
mount c f:\masm
c:
dir
debug
r
#endif
进入debug模式使用 r 命令查看寄存器
a 指令可以在汇编中编写需要的东西
【把要写的东西写入cs:ip地址中,cs:ip,cs 表示的是代码段的地址 + ip表示的是偏移组成20位物理地址】
汇编指令的含义
- mov 寄存器, 数据 如:mov ax ,8
- mov 寄存器 , 寄存器 如: mov ax ,bx
- mov 寄存器 , 内存单元 如:mov ax ,[0]
- mov 内存单元,寄存器 如:mov [0],ax
- mov 段寄存器,寄存器 如:mov ds,ax
使用T指令执行刚刚编写的指令
【mov ax 8 指令的作用:将8移动到ax中】
【mov bx ax 相当于把后面寄存器的值移动到前面的寄存器中】
【mov ch,10】
继续使用命令编写汇编指令
【mov ah ,13】 -----------------> 把8移动到ah的低8位中
【mov bl, 23】 -----------------> 把23移动到bl的高8位中
【mov ch ,al】 -----------------> 把al移动到ch的高8位中
Add指令
【add ax,3】-----------------------> 把3的值加给了ax
【add bx,4】-----------------------> 把4的值加给了bx
【add,cx,bx】-----------------------> 把bx的值加给了cx
数值太大的话会发生越界现象【这个时候会发生进位现象,汇编语言越界会将越界的值舍弃掉】
汇编语言当中超过了特定的界限【多出来的一位会被舍弃掉:高位和地位都是这种情况】
【汇编语言基础Sub指令】
sub 内存单元,寄存器 比如:sub【0】,ax
字母表示的数字含义
A == 10 , B == 11, C == 12,D == 13, E == 14,F == 15,G == 16
汇编寄存器简称
【AX : 累加寄存器】
【BX : 基址寄存器】
【CX : 计数寄存器】
【DX: 数据寄存器】
【SP : 堆栈指针寄存器】
【BP:基址指针寄存器】
【SI:源变址寄存器】
【DI:目的变址寄存器】
【IP:指令指针寄存器】
【CS:代码段寄存器】
【DS:数据段寄存器】
【SS:堆栈段寄存器】
【ES:附加段寄存器】
【OF:溢出标志操作数超出机器能表示的范围,表示溢出,溢出时为1】
【SF:符号标志,记录运算结果的符号,结果负时为1】
【ZF:零标志,运算结果0时为1,否则为0】
【CF:进位标志,最高有效位产生进位时为1,否则为0】
【AF:辅进位标志,运算时,第三位向第四位产生进位时为1,否则为0】
【PF:奇偶标志,运算结果操作数为1的个数为偶数个时为1,否则为0】
【DF:方向标志,用于串处理,DF=1时,每次操作后使SI和DI减小,DF= 0时则增大】
【IF:中断标志 IF = 1 时,允许向CPU响应屏蔽中断,否则关闭中断】
【TF:陷阱标志,用于调试单步操作】
汇编指令:mul,div,and,or
[汇编指令 mul]
- 1:两个数相乘:两个数相乘,要么都是8位,要么都是16位,如果是8位,一个默认放在AL中,另外一个放在8为reg或内存字节单元中,如果是16位,一个默认在AX中,另外一个放在16位的reg或内存字节单元中。
- 2:结果--->如果是8位乘法,结果默认放在AX中:如果是16位乘法结果高位默认在DX中,低位放在AX中
【汇编指令DIV】
- 1:除数-------> 使用div做除法的时候应该注意以下问题
- (除数有8位和16位两种在,在一个reg的内存单元中)
- 2:被除数:默认放在AX或DX和AX中,如果除数为8为,被除数则为16位,默认在AX中存放,如果除数为16位,被除数则为32位,在DX和AX中存放,DX存放高16位,AX存放低16位。
- 3:结果--->如果除数为8位,则AL存储除法操作的商,AH存储除法操作的余数,如果除数为16位,则AX存储除法操作的商,DX存储除法操作的余数。
【mov dx ,f】
【mov ax,4241】
【mov bx,2710】
【div bx】
如果是一个8位数的除法:会将ax 除以 bl 然后将结果放在AL当中
如果是一个16位数的除法:会将ax拼接上dx然后将结果放在ax当中
如果是乘法的话就反过来
【汇编语言 ---------> and 和 or指令】
1:and指令逻辑与指令,按位进行运算
例如指令:[没有二进制的话就要先转换为2进制]
mov al , 01100011B --------------------> 63
mov al , 00111011B --------------------> 3B
执行后:al = 00100011B -----------------------------> 23
一位一位的对比,全1为1【与运算】
一位一位的对比,有1就是1,全0为0 【或运算】
2:or指令,逻辑或指令,按位进行或运算
汇编语言是无法直接运行2进制指令的;需要转换为16进制才能进行处理
或运算指令
mov al,01100011B ------------->
mov al,00111011B
执行后的结果为
al = 01111011B --------------> 7b
shr 和 shl 右移与左移指令
【shl 和 shr 左移和右移指令】
shl和shr是逻辑移位指令,shl是逻辑左移指令功能为
- 1:将一个寄存器或内存单元中的数据向左移位
- 2:将最后移出的一位写入CF中
- 3:最低位用0补充
指令:
mov al,01001000b
shl al,1 ----------------------------> 将al中的数据左移一位
执行后的al = 10010000b CF = 0
我们来看一下shl,al,l的操作过程
左移:
原数据: 01001000
左移后: 01001000
【验证左移后的数据】
- mov al ,48 ------------------------------------> 将48移动到ax寄存器的低四位
- shl al,1 ----------------------------------------> 将al中的数据左移一位
- shr al,1 ----------------------------------------> 将al中的数据右移一位
rol ax,1 【rol表示的是循环左移】 ----------------------------> 这个了解即可
ror ax ,1 【循环右移】 ----------------------------> 这个了解即可
rcl ax ,1 【带进位的循环左移】 ------------------------------> 这个了解即可
rcr ax ,1 【带进位的循环右移】 ------------------------------> 这个了解即可
【指令:inc ax】,【指令:dec ax】 ------------------------------------------------> 表示增加1和减少1
这两个指令相当于是c语言中的 x++ 和c语言中的 x --
空指令 ------------------------------------------------> nop 起到了占位的作用
【汇编语言:交换指令 xchg ax,bx】
【汇编语言取反指令:neg ax】----------------------> ax 刚开始的值为0002 我们观察取反后的值
【退出汇编程序】
【mov ax,4C】 -----------------------------> 相当于退出汇编的指令
【int 21】 -----------------------------> 相当于退出汇编的指令
【物理地址 = 段地址 * 16 + 偏移地址】
【一个物理地址可以有多个段地址和偏移地址表示方法】
【在汇编里面写东西使用 e 指令, 读取使用 D 命令】
我们看到不同的访问方式地址是一样的:二进制左移4位相当于是16进制左移一位
【DS数据段地址寄存器 + 可以通过数据段地址加上偏移地址的方式实现移动】
mov 以21F0为段地址以60为偏移地址,移动到ax中
1234 【前面的两个表示的是低位,后面的两个表示是高位,应该高低搭配,所以吧34移动到AH吧34移动到AL】
将ds为段地址:0000为偏移地址的数据移动到al当中
【汇编语言有汇编语言的限制可以将ax移动到ds,但是不能将1000移动给ds】
汇编语言CS和IP寄存器
使用 u 指令可以将寄存器中的数据翻译出来
【CS是一个段地址IP是一个偏移地址他们两个构成了一个实际的地址,这个地址指向一个指令这个指令可以被执行,执行的是内存里面对应的指令】
【汇编语言中代码和数据是不加区分的】
【汇编语言的jmp指令-------------------------------> jmp指令某一合法寄存器,指令的功能为:用寄存器的值修改IP】
执行指令
[
a 2000:0000
mov ax,6622
mov cx,ax
]
[
a 1000:0000
mov ax,0123
mov ax,0000
mov bx,ax
jmp bx
]
[IP和CS表示的是代码将要执行的指针,表示的是以CS为段地址IP为偏移地址地方的代码]
【CS和IP事一个关键的寄存器,是一个代码段寄存器,指示了CPU当前要读取的地址,CS位代码段寄存器,IP为指令指针寄存器,从名称上我们可以看出它们和指令的关系】