汇编语言基于8086CUP(想学操作系统的前奏!!!)

1、汇编语言的产生

1.1、思维图

1.2、单位转换

1B=8bit

1KB=1024B

1MB=1024KB

1GB=1024MB

1TB=1024GB

1字=2字节=2B=16位

1.3、储存器与内存

因为在这些总线上传输的都是2进制的数,所以可能传输的是相同的2进制数,需要区分哪些是数据,哪些又是指令,所以需要通过不同的总线就行传输来控制。

地址总线:20位2进制

数据总线:16位2进制

控制总线:16位2进制

2、寄存器和内存、栈

2.1、14个寄存器

AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW;

几位寄存器,表示可以存储几位二进制数

AX,BX,CX,DX一般被称为通用寄存器,

AX可以分为AH和AL

BX可以分为BH和BL

CX可以分为CH和CL

DX可以分为DH和DL

2.2、地址总线

由于8086有20位的地址总线,所有在传输16位时需要地址加法器进行处理变成20位

地址加法器:物理地址=段地址*16+偏移地址

传送地址时需要传送两个16位的地址,一个称为段地址,一个称为偏移地址

段寄存器:CS,DS,SS,ES

CS:为代码段寄存器

IP:指令指针寄存器

2.3、DS和[address]

这样的指令 mov ax,[0] (调试的时候可以这么写,写.asm源文件时需要写成 mov bx,0,mov ax,[bx];需要bx中间量来转换一下) 把默认段地址+偏移地址的第一位取出来放到ax上

DS存放的是默认的段地址

2.4、栈(Last in frist out)后进先出

push(入栈)

pop(出栈)

段寄存器SS:存放栈顶的段地址

寄存器SP:存放栈顶的偏移地址

SS:SP表示栈顶元素

2.5、SI和DI

SI和DI,也用来表示偏移地址,使用[bx]时不够用,所以可以使用[SI],[DI]

2.6、栈解决多层循环问题

2.7、寻址方式

寻址方式 含义 名称 常用格式举例
[idata] EA=idata;SA=(ds) 之间寻址 [idata]
[bx]
[si]
[di]
[bp]
EA=(bx);SA=(ds)
EA=(si);SA=(ds)
EA=(di);SA=(ds)
EA=(bp);SA=(ss)
寄存器间接寻址 [bx]
[bx+idata]
[si+idata]
[di+idata]
[bp+idata]
EA=(bx)+idata;SA=(ds)
EA=(si)+idata;SA=(ds)
EA=(di)+idata;SA=(ds)
EA=(bp)+idata;SA=(ss)
寄存器相对寻址 用于结构体[bx].idata
用于数组,idata[si]<br/
[bx+si]
[bx+di]
[bp+si]
[bp+di]
EA=(bx)+(si);SA=(ds)
EA=(bx)+(di);SA=(ds)
EA=(bp)+(si);SA=(ss)
EA=(bp)+(di);SA=(ss)
基址变址寻址 用于二维数组,[[bx][si]][si]
[bx+si+idata]
[bx+di+idata]
[bp+si+idata]
[bp+di+idata]
EA=(bx)+(si)+idata;SA=(ds)
EA=(bx)+(di)+idata;SA=(ds)
EA=(bp)+(si)+idata;SA=(ss)
EA=(bp)+(di)+idata;SA=(ss)
相对基址变址寻址 用于表格
二维数组

2.8、标志位

标志位 作用
ZF 如果执行的结果为0,ZF=1,反之
PF 如果执行的结果中有偶数个1,则PF=1,反之
SF 如果执行的结果中最高位为1,则SF=1,反之
CF 如果计算出现进位或者借位,加法进位,减法借位,会在CF中标志1
OF 如果无符号计算,出现位不够用,出现溢出,会在OF中标出1
DF DF决定串传送指令后,si和di方向的改变,DF=0,+;DF=1,-
TF RF位为1,就产生单步中断,也就是指令t

无符号数:cmp ax,bx

  1. 如果(ax)=(bx),则(ax)-(bx)=0,所以:ZF=1
  2. 如果(ax)!=(bx),则(ax)-(bx)!=0,所以:ZF=0
  3. 如果(ax)<(bx),则(ax)-(bx)将产生借位,所以:CF=1
  4. 如果(ax)>=(bx),则(ax)-(bx)将不借位,所以:CF=0
  5. 如果(ax)>(bx),则(ax)-(bx)不借位且结果不为0,所以:CF=0,且ZF=0
  6. 如果(ax)<=(bx),则(ax)-(bx)可能借位,可能为0,所以:CF=1或者ZF=1

有符号数:cmp ah,bh

  1. 如果(ah)<(bh),则(ah)-(bh)最高位会为1,如果不溢出,则SF=1,OF=0
  2. 如果(ah)>(bh),则(ah)-(bh)最高位会为1,如果溢出,则SF=1,OF=1
  3. 如果(ah)<(bh),则(ah)-(bh)最高位会为0,如果溢出,则SF=0,OF=1
  4. 如果(ah)>=(bh),则(ah)-(bh)最高位会为0,如果不溢出,则SF=0,OF=0

3、汇编指令

3.1、汇编指令的用法

汇编指令 语法描述
mov ax,18 ax=18
add ax,18 ax=ax+18
sub ax,18 ax=ax-18
inc ax ax=ax+1
dec ax ax=ax-1
jmp 段地址:偏移地址 修改CS和IP的内容(在汇编指令使用,编译器不认识)
push ax 把ax入栈
pop ax 把栈顶元素出栈保存到ax中
loop S:需要循环的指令段 loop S 控制循环的指令,具体循环多少次,由CX中的数决定
dw dw 0123H,1234H,0024H 定义数据存放在内存中,占两个字节
db db 0,1,2,4,5,6,7,8 定义数据存放在内存中,占一个字节
and and al,11011111b 与运算,把al的第五位二进制转化为0
or or al,00100000b 或运算,把al的第五位二进制转化为1
div div bx 除法运算,{(dx)*10000H+(ax)}/(bx)
mul mul bx 乘法运算,(dx)10000H+(ax)=(ax)(bx),都是8位就存放在ax中
dd 定义数据存放在内存中,占四个字节,2个字,32位
dup db 200 dup(0)
db 2 dup('ab','AB')
定义了200个连续为0的字节
定义了"adABabAb"的8个字节的数据
jmp short s 段内转移,指令跳转到标号s处,位移为8位
jmp near ptr s 段内转移,指令跳转到标号s处,位移为16位
jmp far ptr s 段间转移,指令跳转到标号s处,改变CS:IP为s处的CS,IP
jmp ax 指令跳转到ax存放的值当作ip去转移
jmp word ptr 内存地址 段内转移,存放的一个字,表示跳转的偏移地址IP
jmp dword ptr 内存单元地址 段间转移,存放的两个字,表示跳转(CS)=(内存+2),(IP)=(内存)
jcxz s 条件段内转移,如果(cx)=0跳转到s处,否则不跳转
mov ax,offset s 取得s处的偏移地址,把值赋给ax
ret 表示把栈顶的元素值给了IP,改变程序执行的位置
retf 表示把栈顶的元素值给了IP,第二个值给 CS
call s 把当前IP入栈,在跳转(位移16位来实现的)到s处,
call far ptr s 把CS入栈、把IP入栈,把s处的段地址给CS、偏移地址给IP
call ax 把当前IP入栈,把通用寄存器ax的值给IP
call word ptr 内存单元地址 把当前IP入栈,IP该我内单元地址2字节
call dword ptr 内存单元地址 把当前CS入栈、IP入s栈,把高位2字节给CS、低位2字节給IP
abc abc ax,bx 带进位加法指令,(ax)=(ax)+(bx)+CF
sbb sbb ax,bx 带进位减法指令,(ax)=(ax)-(bx)-CF
cmp cmp ax,bx 结果不会保存在任何位置,但会影响标志位的变化
je s 等于则转移到 s标志位,ZF=1,equal:等于
jne s 不等于则转移 s标志位,ZF=0,
jb s 低于转移到 s标志位,CF=1,below:小于
jnb s 不低于转移到 s标志位,CF=0
ja s 高于转移到 s标志,CF=0,ZF=0,above:大于
jna s 不高于则转移到 s标志位,CF=1,或者ZF=1
movsb 将ds:si中的值送入es:si中:((es)16+(di))=((ds)16+(si)}),
如果DF=0,则(si)=(si)+1,(di)=(di)+1;
如果DF=1,(si)=(si)-1,(di)=(di)-1
movsw 以字的单元传送,规则同movsb
rep movsb 根据cx的值来重复传送cx次,实现传送字符串的作用
cld 将标志寄存器DF=0
std 将标志寄存器DF=1
pushf 将标志寄存器的值压栈
popf 弹栈出到标志寄存器中
iret 在中断程序执行,IP,CS,标志寄存器的弹栈
shl 向左移动一位,右边补零,移出的一位保存道CF中
shr 向右移动一位,左边补零,移出的一位保存道CF中
cli 将标志寄存器IF=0,不处理外中断
sti 将标志寄存器IF=1,处理外中断

3.2、Windows11下载Dosbox来使用debug命令窗口

第一步去官网下载:Dosbox;[官网 ][ https://www.dosbox.com/download.php?main=1 ]

第二步修改你需要在哪个盘哪个文件中操作:

masm文件

asm文件

最后打开DOSbox.exe就可以操作了

Debug指令

R命令,查看、改变CPU寄存器的内容

D命令,查看内存中的内容

E命令,改变内存中的内容

A命令,可以在段地址CS,偏移地址IP写入一条机器指令

T命令,执行一条机器指令

U命令,将内存中的机器指令翻译成汇编指令

4、汇编源程序

  1. 计算2的三次方

    1. assume cs:abc
    2. abc segment
    3. mov ax,2
    4. add ax,ax
    5. add ax,ax
    6. mov ax,4c00H
    7. int 21H
    8. abc ends
    9. end
  2. 操作内存地址,改变值

    1. assume cs:abc
    2. abc segment
    3. start: mov ax,2000H
    4. mov ds,ax
    5. mov bx,1000H
    6. mov ax,[bx]
    7. inc bx
    8. inc bx
    9. mov [bx],ax
    10. inc bx
    11. inc bx
    12. mov [bx],ax
    13. inc bx
    14. mov [bx],al
    15. inc bx
    16. mov [bx],al
    17. mov ax,4c00H
    18. int 21H
    19. abc ends
    20. end start
  3. 计算2的11次,用loop循环执行

    1. assume cs:abc
    2. abc segment
    3. start: mov ax,2
    4. mov cx,11
    5. S: add ax,ax
    6. loop s
    7. mov ax,4c00H
    8. int 21H
    9. abc ends
    10. end start
  4. 循环操作4个单位内存中数据之和

    1. assume cs:abc
    2. abc segment
    3. start:
    4. mov ax,1000H
    5. mov ds,ax
    6. mov bx,0000H
    7. mov al,0011H
    8. mov ds:[bx],al
    9. mov bx,0001H
    10. mov al,0022H
    11. mov ds:[bx],al
    12. mov bx,0002H
    13. mov al,0033H
    14. mov ds:[bx],al
    15. mov bx,0003H
    16. mov al,0044H
    17. mov ds:[bx],al
    18. mov ax,0000H
    19. mov cx,0004H
    20. mov bx,0004H
    21. mov dx,0000H
    22. S: sub bx,cx
    23. mov al,[bx]
    24. add dx,ax
    25. mov bx,0004H
    26. loop S
    27. mov ax,4c00H
    28. int 21H
    29. abc ends
    30. end start
  5. 利用栈交换顺序

    1. assume cs:abc
    2. abc segment
    3. dw 0123H,1234H,0252H,12A2H,2222H,3333H,4444H,5555H
    4. dw 0,0,0,0,0,0,0,0
    5. start:
    6. mov ax,cs
    7. mov ss,ax
    8. mov sp,32
    9. mov bx,0
    10. mov cx,8
    11. S:
    12. push cs:[bx]
    13. add bx,2
    14. loop S
    15. mov bx,0
    16. mov cx,8
    17. S1:
    18. pop cs:[bx]
    19. add bx,2
    20. loop S1
    21. mov ax,4c00H
    22. int 21H
    23. abc ends
    24. end start
  6. 计算a,b两个段数据依次相加的结果存放到c段中

    1. assume cs:abc,ds:a
    2. a segment
    3. db 1,2,3,4,5,6,7,8
    4. a ends
    5. b segment
    6. db 1,2,3,4,5,6,7,8
    7. b ends
    8. c segment
    9. db 0,0,0,0,0,0,0,0
    10. c ends
    11. abc segment
    12. start:
    13. mov ax,a
    14. mov ds,ax
    15. mov dx,0000H
    16. mov cx,8
    17. S: mov bx,dx
    18. mov ah,ds:[bx]
    19. add bx,16
    20. mov al,ds:[bx]
    21. add ah,al
    22. add bx,16
    23. mov ds:[bx],ah
    24. add dx,1
    25. loop S
    26. mov ax,4c00H
    27. int 21H
    28. abc ends
    29. end start
  7. 将小写字母转化为大小字母

    1. assume cs:abc,ds:a
    2. a segment
    3. db 'BAsiC'
    4. db 'abcdefgh'
    5. a ends
    6. abc segment
    7. start:
    8. mov ax,a
    9. mov ds,ax
    10. mov bx,0
    11. mov cx,5
    12. S1: mov al,[bx]
    13. and al,11011111b
    14. mov [bx],al
    15. inc bx
    16. loop S1
    17. mov bx,5
    18. mov cx,8
    19. S2: mov al,[bx]
    20. and al,11011111b
    21. mov [bx],al
    22. inc bx
    23. loop S2
    24. mov ax,4c00H
    25. int 21H
    26. abc ends
    27. end start
  8. 把每一个小写字母的前四位转化为大写

    1. assume cs:code,ds:data,ss:stack
    2. data segment
    3. db '1. abcdef.......'
    4. db '2. mnijwq.......'
    5. db '3. iloveyou.....'
    6. db '4. oklolp.......'
    7. data ends
    8. stack segment
    9. dw 0,0,0,0,0,0,0,0
    10. stack ends
    11. code segment
    12. start:
    13. mov ax,data
    14. mov ds,ax
    15. mov ax,stack
    16. mov ss,ax
    17. mov sp,16
    18. mov bx,0
    19. mov cx,4
    20. S0: push cx
    21. mov si,0
    22. mov cx,4
    23. S1: mov al,[bx+3+si]
    24. and al,11011111b
    25. mov [bx+3+si],al
    26. inc si
    27. loop S1
    28. add bx,16
    29. pop cx
    30. loop S0
    31. mov ax,4c00H
    32. int 21H
    33. code ends
    34. end start
  9. cmd窗口中间输入不同颜色和背景的字符串

    1. assume cs:code,ds:data,ss:stack
    2. data segment
    3. db 'welcome to masm!'
    4. db 02h,24h,71h
    5. data ends
    6. stack segment
    7. dw 8 dup(0)
    8. stack ends
    9. code segment
    10. start:
    11. mov ax,data
    12. mov ds,ax
    13. mov ax,stack
    14. mov ss,ax
    15. mov sp,10h
    16. xor bx,bx
    17. mov ax,0b872h
    18. mov cx,3
    19. s3: push cx
    20. push ax
    21. push bx
    22. mov es,ax
    23. mov si,0
    24. mov di,0
    25. mov cx,10h
    26. s1: mov al,ds:[si]
    27. mov es:[di],al
    28. inc si
    29. add di,2
    30. loop s1
    31. mov di,1
    32. pop bx
    33. mov al,ds:10h[bx]
    34. inc bx
    35. mov cx,10h
    36. s2: mov es:[di],al
    37. add di,2
    38. loop s2
    39. pop ax
    40. add ax,0ah
    41. pop cx
    42. loop s3
    43. mov ax,4c00h
    44. int 21H
    45. code ends
    46. end start

    结果:

  10. 利用call和ret来实现函数,计算一组数的三次方并保存在内存中

    1. assume cs:code,ds:data
    2. data segment
    3. dw 1,2,3,4,5,6,7,8
    4. dw 0,0,0,0,0,0,0,8
    5. data ends
    6. code segment
    7. start:
    8. mov ax,data
    9. mov ds,ax
    10. mov cx,8
    11. mov di,0
    12. s0: mov bx,ds:[di]
    13. call s
    14. mov ds:[di+16],ax
    15. add di,2
    16. loop s0
    17. mov ax,4c00h
    18. int 21H
    19. s: mov ax,bx
    20. mul bx
    21. mul bx
    22. ret
    23. code ends
    24. end start

汇编语言基于8086CUP(想学操作系统的前奏!!!)的更多相关文章

  1. 结合jquery的前后端加密解密 适用于WebApi的SQL注入过滤器 Web.config中customErrors异常信息配置 ife2018 零基础学院 day 4 ife2018 零基础学院 day 3 ife 零基础学院 day 2 ife 零基础学院 day 1 - 我为什么想学前端

    在一个正常的项目中,登录注册的密码是密文传输到后台服务端的,也就是说,首先前端js对密码做处理,随后再传递到服务端,服务端解密再加密传出到数据库里面.Dotnet已经提供了RSA算法的加解密类库,我们 ...

  2. 单片机和Linux都想学_换个两全的方法学习单片机

    本节教你如何学习单片机,如何选择合适的开发板和开发工具. 现在我们知道单片机是要学习的,那么怎么去学习单片机?在上一课我们说不要使用老一套的方法学习,实际上是指的两个问题. 第一:选择什么开发板: 第 ...

  3. 2014年9月21日_随笔,jdic,ETL,groovy,Nutz好多东西想学

    (1)老妈十一要回老家,才突然发现买票好难啊.有亲朋很重要 (2)这周我做了什么.jdic,ETL,groovy, Nutz好多东西想学. Nutz开发成员专访.Nutz优酷视频(演讲).Nutz 入 ...

  4. 最近想学Json,请问大家有没有什么好的Json教程介绍一下?

    最近想学json,请问大家有没有什么好的Json教程介绍一下? 最近学完java的框架了,想了解一下json,可是找不到相关视频,请大家有这方面的Json教程好资料就介绍下啦,最后有网址链接啦. {} ...

  5. 少年,想学带修改主席树吗 | BZOJ1901 带修改区间第k小

    少年,想学带修改主席树吗 | BZOJ1901 带修改区间第k小 有一道题(BZOJ 1901)是这样的:n个数,m个询问,询问有两种:修改某个数/询问区间第k小. 不带修改的区间第k小用主席树很好写 ...

  6. 为什么43%前端开发者想学Vue.js

    根据JavaScript 2017前端库状况调查 Vue.js是开发者最想学的前端库.我在这里说明一下我为什么认为这也是和你一起通过使用Vue构建一个简单的App应用程序的原因. 我最近曾与Evan ...

  7. APP爬虫(1)想学新语言,又没有动力,怎么办?

    最近Python和GO语言很火,想学但是只能看得懂21天精通这种级别的教程.公司的项目暂时不会上py或go的技术栈,给的薪资福利待遇还可以,暂时又不想辞职.没有项目实战经验,完全看不懂大神写的干货,怎 ...

  8. 给想学python但还没有接触过的你,python代码的书写规则,小白入门

    Python 文件结构 变量命名 注释 单行注释 多行注释 缩进 Python 文件结构 #!/usr/bin/env python3 # 指定python解释器 # -*- coding: utf- ...

  9. 想学大学计算机课?这 37 门 CS 专业必修课,了解一下

    最近,不少高校延迟开学,大家只能宅家上网课. 有一些朋友,想趁此期间,多学点计算机的专业课,却不知从何学起. 211,985大学的计算机专业课都是经过授课教师精心安排的,从大一到大四,课程合理设置,循 ...

随机推荐

  1. 使用Spring MVC开发RESTful API

    第3章 使用Spring MVC开发RESTful API Restful简介 第一印象 左侧是传统写法,右侧是RESTful写法 用url描述资源,而不是行为 用http方法描述行为,使用http状 ...

  2. Spark: 单词计数(Word Count)的MapReduce实现(Java/Python)

    1 导引 我们在博客<Hadoop: 单词计数(Word Count)的MapReduce实现 >中学习了如何用Hadoop-MapReduce实现单词计数,现在我们来看如何用Spark来 ...

  3. 什么是HBase?终于有人讲明白了

    一.初识HBase HBase 是一个面向列式存储的分布式数据库,其设计思想来源于 Google 的 BigTable 论文.HBase 底层存储基于 HDFS 实现,集群的管理基于 ZooKeepe ...

  4. 给小白的 PG 容器化部署教程(下)

    作者:王志斌 编辑:钟华龙 本文来自社区小伙伴 王志斌 的投稿.从小白的角度,带你一步步实现将 RadonDB PostgreSQL 集群部署到 Kubernetes 上.文章分为上下两部分,< ...

  5. Hive参数与性能企业级调优

    Hive作为大数据平台举足轻重的框架,以其稳定性和简单易用性也成为当前构建企业级数据仓库时使用最多的框架之一. 但是如果我们只局限于会使用Hive,而不考虑性能问题,就难搭建出一个完美的数仓,所以Hi ...

  6. 线程安全性-原子性之Atomic包

    先了解什么是线程安全性:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称为这个类是线程 ...

  7. 20.LVS负载均衡群集—NAT模式实例

    LVS负载均衡群集-NAT模式实例 目录 LVS负载均衡群集-NAT模式实例 群集引用概述 群集的含义 问题 解决方法 企业群集分类 群集的三种类型 负载均衡群集(Load Balance Clust ...

  8. 知道vue组件同级传值吗?

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 关于Vue的几个实用知识点(持续更新中……)

    前言 排名不分先后,按自己习惯来的. 一.provide.inject 高级组件 总述: provide在父组件中定义,inject 在子孙组件中定义. provide:选项应该是一个对象或返回一个对 ...

  10. element ui 自定义主题失败(primordials is not defined)

    卸载: 1.卸载cnpm npm uninstall cnpm -g 2.卸载vue-cli npm uninstall @vue/cli -g 3.卸载nodejs和删除文件 C:\Program ...