首页 > 编程语言 >汇编语言初识

汇编语言初识

时间:2023-08-02 14:48:18浏览次数:35  
标签:编程语言 汇编语言 mov 地址 初识 寄存器 ax CPU

汇编语言初识 8086

所有的编程语言都是一种解决问题的方法如果说
java,C++,go,python之类的编程语言是面向对象的编程语言
C,Pasical之类的编程语言是面向过程的编程语言
那么像汇编这样的底层编程语言,应该就是所谓的面向CPU的编程语言
因为它从头到尾都是和CPU在打交道

万物皆内存

在计算机中所有的IO设备, 包括硬盘、内存、显卡, 它们在CPU看来都是在一个逻辑内里面, 只是分配在不同的段, 有着不同的内存地址而已. 所以本质上他们都可以抽象成内存空间的一部分.

计算机的三条生命线

  1. 地址线: 传达要访问内存空间的地址
  2. 数据线: CPU和内存之间传递数据的桥梁
  3. 控制线: CPU发号施令的号旗

其中每一条线都有着不同的宽度, 它们的宽度决定了传送数据量的多少.

我们都知道一个导线可以表达一个0或者1, 两根导线就可以通过二进制的方式表达两位二进制数.

当然上面的三条线不是真的就三条, 它们本身就一类线的总称, 因为总不能就一条线就可以传递地址或者数据信息吧!

寄存器

AX, BX, CX, DX这四个是通用寄存器, 其中可以保存一个字的大小(由两个内存单元组成)

其中它们都可以拆分使用, 比如AX可以拆分成

AL和AH 分别表示AX低8位和高8位.

CS, SS, DS这三个是段寄存器, 和通用寄存器的大小一样.

IP, SP就是类似指针一样的寄存器, 大小也和通用寄存器一样.

最常见的汇编命令

mov 目标,源
add 目标,参加计算的第二个数
sub 目标,参加计算的第二个数

地址计算

地址 = 段地址 * 16 + 偏移地址

所以地址常用 段地址:偏移地址 来表示, 例如 2000:0003

段寄存器一般用于保存段地址

IP, SP这种类似指针的, 常用于表示偏移地址

常见的程序段

代码段 CS (code segment)

这个内存段主要存储需要执行的代码

CPU会自动将CS存储的段地址和IP存储的偏移量计算出来的地址作为当前需要执行指令的地址.
要想在程序中实现更改CS和IP

可以使用

jmp 2000:0003

; <=>

mov ax,2000H
mov cs,ax
mov ip,0003H

; 常量存储的位置不太一样不能直接使用 mov cs,2000

每次执行完一条语句, IP会自动移动到下一个

数据段 DS (data segment)

和之前的代码段有点不太一样, 数据段没有专门用于存储偏移地址的寄存器

只有对应的段寄存器

mov ax,[0]
; 将cs:0000位置数据放到ax
mov [0],ax
; 将ax的数据放到cs:0000

堆栈段 SS (stack segment)

存储堆栈(stack)数据

SS作为段寄存器
SP作为存储偏移地址的寄存器

push ax
; 入栈, 将ax的数据存入
pop ax
; 出栈, 将弹出的数据存入ax

CPU执行的时候不会执行任何检测, 要注意是否超出了堆栈的范围
SP会自动进行加减

一个简单的汇编程序

assume cs:codesg

codesg segment

    mov ax,0123H
    mov bx,0456H
    add ax,bx
    add ax,ax

    ; 下面两行是dos退出程序
    mov ax,4c00H
    int 21H

codesg ends

end

assume是伪指令就是用于定义一个段的
segmentends标记段的开始和结束
end表示程序的结束

tip

如果需要清零

mov ax,0
sub ax,ax; 字节数更少

标签:编程语言,汇编语言,mov,地址,初识,寄存器,ax,CPU
From: https://www.cnblogs.com/JacekYang/p/17600586.html

相关文章

  • 初识Linux
    初识Linux运维的本质运维:运行维护应用程序岗位需求:自动化运维、DBA、docker+K8s...运维职责:1.尽可能保证应用程序24小时不间断运行 2.尽可能保证数据的安全 3.尽可能提升程序的响应速度 ps:上述三个职责也是服务器应该具备的"""1.socket模块2.TCP协议3.......
  • 计算机基础与JavaScript初识
    一:编程介绍编程:就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程.计算机程序:就是计算机所执行的一系列的指令集合,而程序全部都是用我们所掌握的语言来编写的,所以人们要控制计算机一定要通过计算机语言向计算机发出命令。从事编程的人员,就是程......
  • 【3.0】DRF之初识
    【一】序列化与反序列化api接口开发,最核心最常见的一个过程就是序列化【1】序列化把我们识别的数据转换成指定的格式提供给别人。例如:我们在django中获取到的数据默认是模型对象(queryset)但是模型对象数据无法直接提供给前端或别的平台使用所以我们需要把数据进行......
  • 【汇编】王爽《汇编语言(第3版)》相关习题
    P25检测点2.2(1)偏移地址的取值范围在0H~FFFFH之间。仅通过变化偏移地址寻址,根据物理地址计算公式:段地址*10H+偏移地址。已知段地址固定0001H,即最小物理地址为00010H,最大地址为1000FH。(2)设偏移地址为x,即公式为:SA*10H+x=20000H。偏移地址的取值范围......
  • 【Spring Boot 初识丨八 丨外部应用程序属性 】
    上一篇讲了SpringBoot的外部化配置的加载顺序及一些简单的属性说明本篇来讲一讲外部化配置一些比较重要的部分SpringBoot初识:(外部化配置详解)外部应用程序属性  当您的应用程序启动时,SpringBoot将自动从以下位置查找并加载application.properties和application.......
  • 初识C++
    C++对C语言设计不合理的地方进行了优化,下面来看一下到底进行了什么优化。一、C++关键字(C++98)C++总计63个关键字,C语言32个。二、命名空间在C/C++中,变量、函数、和类都是大量存在的,这些变量、函数和类的名称都将存在于全局作用域中,可能会导致很多命名冲突。使用命名空间的目的就是对......
  • 初识c语言
    一、数据类型char字符型short短整型int整型long长整型longlong更长整型float单精度浮点数double双精度浮点数下面是对每个数据类型所占字节的确定:#include<stdio.h>intmain(){ printf("%d\n",sizeof(int)); printf("%d\n",sizeof(double)); printf("%d\n",sizeof(......
  • 【Spring Boot 初识丨外部化配置属性详解 】
    上一篇讲了SpringBoot的依赖注入本篇来讲一讲SpringBoot外部化配置SpringBoot初识:(PropertySource)加载顺序  SpringBoot使用一种非常特殊的PropertySource顺序,旨在允许合理地覆盖值。后面的属性源可以覆盖前面定义的值。按以下顺序考虑来源:默认属性(由SpringA......
  • 云图说丨初识华为云OrgID:轻松实现统一帐号、统一授权
    本文分享自华为云社区《【云图说】第282期初识华为云OrgID:轻松实现统一帐号、统一授权》,作者:阅识风云。组织成员帐号OrgID是面向企业提供组织管理、企业成员帐号管理以及SaaS应用授权管理能力的云服务。OrgID将HuaweiID帐号体系延伸到企业用户,统一华为云面向生态SaaS服务的组......
  • django 初识
    一、手撸web框架推导框架的演变过程,思路是重点1、写一个服务端importsocketserver=socket.socket()server.bind(('127.0.0.1',9000))server.listen(3)whileTrue:conn,addr=server.accept()data=conn.recv(1024)print(data.decode('utf8'))......