汇编语言学习

目录

第1节.编程环境的安装

第2节.汇编语言寄存器

1.Debug的六种指令使用(truead),四个通用寄存器

1.R命令-- 查看、改变CPU寄存器的内容

2. D命令 -- 查看内存中的内容

3. E命令 -- 改写内存中的内容

4.A命令 -- 以汇编指令的形式在内存中写入机器指令

5.T命令 -- 继续执行a命令写入的机器指令

6. U命令--将内存单元里的机器语言翻译成汇编命令。

2.常用指令集合(进位或借位时都舍去,不显示)

1.mov指令

2.add指令

3.sub指令

4.mul指令

5.div指令

3.其他指令(and、or、inc、dec、nop、neg、xchg、移位和中断)

4. ds寄存器、段地址、偏移地址、物理地址

5.CS和IP寄存器,jmp指令

6.SS-SP寄存器、栈的push、pop指令

7.BP、SI、DI寄存器,寻址方式、寄存器总结

8.标志寄存器ZF、PF、SF、OF

第3节.条件判断语句cmp,je,ja,jb以及adc、sbb指令

1. adc指令--带进位加法指令

2.sbb指令--带借位减法指令

3.cmp指令--compare比较指令

第4节.用源文件写汇编代码

1.code.asm

2.循环语句loop、等差数列求和

3.函数call、ret指令

4.call far ptr和retf指令,本质是栈、goto指令

5.代码段、数据段、栈段、dup指令

6.offset指令、jmp short、far,dword ptr各种跳转指令

7.数组的读取和写入,type指令和一些杂项

第5节.实战篇

1.输出hello world,求数组最大、最小值,字符串转大、小写

2.通用代码--数组求和、拷贝数组、斐波那契数列、si配合di翻转数组

3.用栈翻转数组,动态规划求斐波那契数列

4.二重循环将二维数组的某列、某矩形转大写

5.汇编语言版冒泡排序

6.十进制和十六进制转换、lea指令、写注释

7.C语言反汇编

ps:参考视频:阿婆主海蓬莱的《汇编语言》速成指南。

        参考书目:王爽老师的《汇编语言》


第1节.编程环境的安装

1.将编程环境压缩包解压缩

2.双击.exe文件进行DOSBox的安装

next

安装

3.将MASM文件复制到D盘根目录下。

4.DOSBox安装成功后更改配置文件,更改页面大小。

将output参数改为ddraw, withdowresolution改为1200x640,屏幕就可以放大显示了。

mount c d:masm将D盘下的MASM文件挂载到C盘上。

第2节.汇编语言寄存器

1.Debug的六种指令使用(truead),四个通用寄存器

  debug --进入debug

1.R命令-- 查看、改变CPU寄存器的内容

r -- 查看寄存器信息以及寄存器中的内容

r ax -- 更改寄存器的内容

2. D命令 -- 查看内存中的内容

d 段地址:偏移地址(十六进制的)

3. E命令 -- 改写内存中的内容

e 地址 d1 d2 d3 d4...dn ----- 直接修改要修改的值

e 地址 进入地址进行修改。回车会跳进地址里。

12.AB 将原来的12改成AB,空格进行下一个值的修改

4.A命令 -- 以汇编指令的形式在内存中写入机器指令
5.T命令 -- 继续执行a命令写入的机器指令

add bx,ax ---- 将 ax 和 bx 的内容加和写到bx中

mov cx,ax ---- 将 ax 的内容拷贝到cx中

6. U命令--将内存单元里的机器语言翻译成汇编命令。

2.常用指令集合(进位或借位时都舍去,不显示)

1.mov指令

2.add指令

验证一下CX+CX=0x08D1+0x08D1=?

3.sub指令

4.mul指令

mul指令的使用规则

5.div指令

AX / BL = AL

DX+AX / BX = AX

3.其他指令(and、or、inc、dec、nop、neg、xchg、移位和中断)

1.and和or指令

2.inc 和 dec指令,nop空指令,占一个字节(可将前面的代码移动到空的代码段中去)。

3.xchg指令 -- 交换两个寄存器的内容

4.neg -- 取反指令

反码

补码-->原码取反+1

5.移位

shr -- 逻辑右移

shl -- 逻辑左移

ror -- 循环右移

rol -- 循环左移

rcr -- 带进位的循环右移

rcl -- 带进位的循环左移

6.中断指令

除以零产生中断==int 0中断

int 0

指针跳转。

int 21中断 --- 退出汇编的中断指令

4. ds寄存器、段地址、偏移地址、物理地址

1.段地址x16+偏移地址=物理地址

2.DS寄存器--Data Segment--访问数据的段地址

5.CS和IP寄存器,jmp指令

1.CS(Code Session代码段寄存器-段地址):IP(Instruction Pointer指令指针寄存器-偏移地址) --表示代码要执行的指针。

2. jmp指令有两种形式:第一种,jmp CS:IP; 第二种,jmp bx【代码段地址不变,指令指针偏移地址变】

6.SS-SP寄存器、栈的push、pop指令

SS:SP指向栈顶元素

栈地址由小到大

push ax /  push [data]

pop ax / pop[data]

7.BP、SI、DI寄存器,寻址方式、寄存器总结

BP和BX只能出现一个,SI和DI只能出现一个,不能同时使用.

例:mov ax,[bx+1+si]==mov ax,1.[bx][si]

8.标志寄存器ZF、PF、SF、OF

1.ZF(Zero Flag)零标志位,ZR(ZF=1)和NZ

2.PF(Parity Flag)奇偶标志位--运算结果操作数为1的个数

偶数PE(PF=1) ,奇数PO

3.SF(Sign Flag)符号标志位,负数NG-negative(SF=1),非负数PL-positive

4.CF(Carry Flag)进位标志位,进位、借位CY(CF=1),没进位NC

5.OF(Overflow Flag)溢出标志位,溢出OV(OF=1),没溢出NV

在进行有符号数运算的时候,如果超出了机器所能表示的范围(-127~128)称为溢出。

第3节.条件判断语句cmp,je,ja,jb以及adc、sbb指令

1. adc指令--带进位加法指令

2.sbb指令--带借位减法指令

sbb ax,bx ---> (ax)-(bx)-(CF) -- 借位上的值CF=0或1

3.cmp指令--compare比较指令

相当于减法指令,但不保存结果

第4节.用源文件写汇编代码

1.code.asm

1.用记事本或者visual studio编写代码,更改后缀名为.asm

2.在汇编环境中dir确认有.asm文件

3.代码编译

4.链接生成.exe文件

5.进入debug,查看code.exe文件,执行code.asm文件中的指令

2.循环语句loop、等差数列求和

1.debug指令 g IP--直接跳转到当前地址,此前的代码都执行完毕

例如:g 1002

2.p指令 -- 直接跳转到下一个指令(可跳出循环)

3.等差数列求和

C代码

.asm文件

3.函数call、ret指令

4.call far ptr和retf指令,本质是栈、goto指令

  • ret指令用栈中的数据,修改IP的内容,从而实现近转移 -- 弹栈
  • retf指令,用栈中的数据,修改CS和IP的内容,从而实现远转移
  • call指令,相对于IP的转移位移 -- 将当前return回来的那条指令的IP或CS和IP压入栈SS:SP中
  • “call far ptr 标号”指令,实现的是段间转移

call far ptr 和 retf指令

5.代码段、数据段、栈段、dup指令

dw-define word定义字,一个字-两个字节-16bit

在代码段中使用数据

数据段、代码段、栈段的存储空间是连续的,并且至少占了16位。

代码开始前和结束end后的start,只要代码段前存储了数据,就要写start,为了让CS:IP指向正确的地址。

6.offset指令、jmp short、far,dword ptr各种跳转指令

  • offset指令 -- 取得标号的偏移地址。

mov dx,cs:[si] -- 将cs:[si]的机器码给dx。

  • 依据位移进行转移的jmp指令 -- 转到标号处执行指令。
  • jmp short  段内短转移 -- 对IP的修改范围在-128~127。只记录了偏移地址。
  • (IP)=(IP)+ 所读取指令的长度 8位位移
  • 8位位移 = 标号处的地址-jmp指令后的第一个字节的地址
  • 03+09=12 --- 0C

  • jmp near ptr --段内近转移 -- (IP)=(IP)+ 16位位移
  • 16位位移=标号处的地址-jmp指令后第一个字节的地址

  • jmp far ptr -- 远转移 ,记录了跳转的段地址和偏移地址

IP跳转到0123

  • jmp dword ptr

7.数组的读取和写入,type指令和一些杂项

mov ax arr[0]  --- 找到arr对应的内存,将它加0个字节

arr[2] --- arr + 2这个地址所对应的内存

如果想在代码中直接用数据标号访问数据,则需要用伪指令assume将标号所在的段和一个段寄存器联系起来。

mov ax,data

mov ds,ax

直接 mov al,arr2 默认找到arr2对应地址内存里的第一个内容

mov arr2, al 向数组中写入数据

arr2[2] 相当于 相应的段地址:数组的偏移地址

第5节.实战篇

1.输出hello world,求数组最大、最小值,字符串转大、小写

  • hello world输出

  • 大小写转换

and al,11011111B 小写->大写

or al,100000B 大写->小写

or al, 20H

直接在命令窗口code 输出小写的hello world

  • 数组最小值和最大值

  

注释

2.通用代码--数组求和、拷贝数组、斐波那契数列、si配合di翻转数组

  • 汇编语言基本格式

  • 数组求和

  • 拷贝数组

  • si配合di翻转数组

  • 注释总结

3.用栈翻转数组,动态规划求斐波那契数列

  • 用栈翻转数组

  • 斐波那契数列求和

4.二重循环将二维数组的某列、某矩形转大写

  • 二维数组将每组的第一个b变成B

  • 二重循环将所有a变成A

5.汇编语言版冒泡排序

6.十进制和十六进制转换、lea指令、写注释

  • 十进制和十六进制转换

 

  • lea指令

lea dx,res    等价于    mov dx,offset res

7.C语言反汇编

push入栈,参数入栈顺序是从右到左。

开辟栈空间----放指抬压

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值