汇编语言基于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的三次方

    assume cs:abc
    
    abc segment
    mov ax,2
    add ax,ax
    add ax,ax mov ax,4c00H
    int 21H
    abc ends end
  2. 操作内存地址,改变值

    assume cs:abc
    
    abc segment
    
    start:	mov ax,2000H
    mov ds,ax
    mov bx,1000H
    mov ax,[bx]
    inc bx
    inc bx
    mov [bx],ax
    inc bx
    inc bx
    mov [bx],ax
    inc bx
    mov [bx],al
    inc bx
    mov [bx],al mov ax,4c00H
    int 21H
    abc ends end start
  3. 计算2的11次,用loop循环执行

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

    assume cs:abc
    
    abc segment
    
    start:
    mov ax,1000H
    mov ds,ax mov bx,0000H
    mov al,0011H
    mov ds:[bx],al mov bx,0001H
    mov al,0022H
    mov ds:[bx],al mov bx,0002H
    mov al,0033H
    mov ds:[bx],al mov bx,0003H
    mov al,0044H
    mov ds:[bx],al mov ax,0000H
    mov cx,0004H
    mov bx,0004H
    mov dx,0000H
    S: sub bx,cx
    mov al,[bx]
    add dx,ax
    mov bx,0004H
    loop S mov ax,4c00H
    int 21H abc ends end start
  5. 利用栈交换顺序

    assume cs:abc
    
    abc segment
    dw 0123H,1234H,0252H,12A2H,2222H,3333H,4444H,5555H
    dw 0,0,0,0,0,0,0,0 start:
    mov ax,cs
    mov ss,ax
    mov sp,32
    mov bx,0
    mov cx,8
    S:
    push cs:[bx]
    add bx,2
    loop S mov bx,0
    mov cx,8
    S1:
    pop cs:[bx]
    add bx,2
    loop S1 mov ax,4c00H
    int 21H abc ends end start
  6. 计算a,b两个段数据依次相加的结果存放到c段中

    assume cs:abc,ds:a
    
    a segment
    db 1,2,3,4,5,6,7,8
    a ends b segment
    db 1,2,3,4,5,6,7,8
    b ends c segment
    db 0,0,0,0,0,0,0,0
    c ends abc segment
    start:
    mov ax,a
    mov ds,ax
    mov dx,0000H
    mov cx,8 S: mov bx,dx
    mov ah,ds:[bx]
    add bx,16
    mov al,ds:[bx]
    add ah,al
    add bx,16
    mov ds:[bx],ah
    add dx,1
    loop S mov ax,4c00H
    int 21H
    abc ends end start
  7. 将小写字母转化为大小字母

    assume cs:abc,ds:a
    
    a segment
    db 'BAsiC'
    db 'abcdefgh'
    a ends abc segment
    start:
    mov ax,a
    mov ds,ax mov bx,0 mov cx,5
    S1: mov al,[bx]
    and al,11011111b
    mov [bx],al inc bx
    loop S1 mov bx,5 mov cx,8
    S2: mov al,[bx]
    and al,11011111b
    mov [bx],al inc bx
    loop S2 mov ax,4c00H
    int 21H
    abc ends end start
  8. 把每一个小写字母的前四位转化为大写

    assume cs:code,ds:data,ss:stack
    
    data segment
    db '1. abcdef.......'
    db '2. mnijwq.......'
    db '3. iloveyou.....'
    db '4. oklolp.......'
    data ends stack segment
    dw 0,0,0,0,0,0,0,0
    stack ends code segment
    start:
    mov ax,data
    mov ds,ax
    mov ax,stack
    mov ss,ax
    mov sp,16 mov bx,0
    mov cx,4
    S0: push cx
    mov si,0
    mov cx,4
    S1: mov al,[bx+3+si]
    and al,11011111b
    mov [bx+3+si],al
    inc si
    loop S1 add bx,16
    pop cx
    loop S0 mov ax,4c00H
    int 21H
    code ends end start
  9. cmd窗口中间输入不同颜色和背景的字符串

    assume cs:code,ds:data,ss:stack
    
    data segment
    db 'welcome to masm!'
    db 02h,24h,71h
    data ends stack segment
    dw 8 dup(0)
    stack ends code segment start:
    mov ax,data
    mov ds,ax
    mov ax,stack
    mov ss,ax
    mov sp,10h xor bx,bx
    mov ax,0b872h mov cx,3
    s3: push cx
    push ax
    push bx mov es,ax mov si,0
    mov di,0 mov cx,10h s1: mov al,ds:[si]
    mov es:[di],al
    inc si
    add di,2
    loop s1 mov di,1
    pop bx
    mov al,ds:10h[bx]
    inc bx mov cx,10h
    s2: mov es:[di],al
    add di,2
    loop s2 pop ax
    add ax,0ah pop cx
    loop s3 mov ax,4c00h
    int 21H code ends end start

    结果:

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

    assume cs:code,ds:data
    
    data segment
    dw 1,2,3,4,5,6,7,8
    dw 0,0,0,0,0,0,0,8
    data ends code segment start:
    mov ax,data
    mov ds,ax mov cx,8
    mov di,0
    s0: mov bx,ds:[di]
    call s
    mov ds:[di+16],ax
    add di,2
    loop s0 mov ax,4c00h
    int 21H s: mov ax,bx
    mul bx
    mul bx
    ret code ends
    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. 从标准输入流中读取并执行shell指定函数

    巧妙的ohmytmux配置 看oh my tmux的配置,发现他们很巧妙的将配置和shell函数放到一个文件里 比如切换鼠标模式的相关配置和shell函数, # : << EOF # .. ...

  2. 跨域问题及其解决方法(JSONP&CORS)

    一.什么是跨域 当a.qq.com域名下的页⾯或脚本试图去请求b.qq.com域名下的资源时,就是典型的跨域行为.跨域的定义从受限范围可以分为两种,⼴义跨域和狭义跨域. (一)广义跨域 ⼴义跨域通常包 ...

  3. README.exe 是的,你看错是EXE

    SmartIDE让你的README变成可执行文档,再也不用编写无用的文档,再也不必操心环境问题.   作为开发者,拿到一个新的代码库的时候一般都会先去看README文件,通过这个文件可以知道这套代码所 ...

  4. 【JSOI2016】最佳团体

    思路:二分答案+动态规划(结合dfs序) 类型:选/不选:最大比值 代码: #include<stdio.h> #include<bits/stdc++.h> using na ...

  5. 两个月吃透阿里P9推荐260页SpringBoot2企业应用实战pdf入职定P6+

    前言 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置 ...

  6. 2021年第十二届蓝桥杯javaA组省赛部分题目

    试题 D: 路径 本题总分:10 分 [问题描述] 小蓝学习了最短路径之后特别高兴,他定义了一个特别的图,希望找到图 中的最短路径. 小蓝的图由 2021 个结点组成,依次编号 1 至 2021. 对 ...

  7. Datax源码改造关键步骤记录

    Datax源码改造关键步骤记录: 一.作业配置1.一个job配置:reader 和writer 的column 字段必须是所有表共有的:2.reader多张表,writer一个表时,所有reader的 ...

  8. vue组件data函数

    vue组件data通常定义为一个函数并return一个对象,对象中定义的就是组件数据,当然定义数据还有props.computed等方式. data如果直接定义为对象data: {message: ' ...

  9. OAuth2学习中的一些高频问题的QA

    关于OAuth2相信很多初学者都有一些疑问,胖哥将这些疑问一一收集了起来做成了QA,或许能帮助学习者. OAuth2相关的QA Q:OAuth2 的一些常用场景? A: OAuth2主要用于API授权 ...

  10. SpringBoot的浅浅配置和小整合

    SpringBoot的浅浅配置和小整合 本文如题,就是浅浅记录一下学习的过程中一些过程,比较简单,并没有多少深度.谢谢! SpringBoot创建 从IDEA中新建项目或者模块.注意jdk版本,一般不 ...