【汇编】数据在哪里?有多长、div指令实现除法、dup设置内存空间

简介: 【汇编】数据在哪里?有多长、div指令实现除法、dup设置内存空间

前言


汇编语言是一种底层的编程语言,直接与计算机硬件交互。在这个世界中,我们需要关心数据存储的位置、数据的大小,以及如何进行一些基本的操作,比如除法运算。本文将带你探索这其中的一些概念,首先,我们将了解数据在计算机内存中的存储方式,考察数据的位置和大小。接着,我们将深入研究汇编语言中的 div 指令,它是如何实现除法运算的。最后,我们将介绍 dup 这个神秘的操作符,它在汇编语言中是如何帮助我们设置内存空间的。


数据在哪里?有多长:


计算机内存是程序运行时存储和访问数据的地方。但是,数据并不是随意散落在内存中的,而是按照一定规则组织的。在汇编语言中,我们需要关心数据的位置和大小。了解数据存储的位置对于正确读写数据至关重要。同时,每个数据都有自己的大小,这影响着它在内存中占据的空间大小。理解数据的位置和大小是编写高效程序的基础。


div指令实现除法:


在计算机科学中,除法是一项基本的数学运算。在汇编语言中,我们使用 div 指令来实现除法运算。这个指令负责将一个寄存器中的值除以另一个寄存器或者内存中的值,并将商和余数存放在指定的寄存器中。深入了解 div 指令的原理,能够让我们更好地利用计算机的底层特性进行数学运算。


dup设置内存空间:


编写程序时,我们常常需要为数组或者缓冲区分配内存空间。在汇编语言中,使用 dup 操作符可以方便地重复定义数据块,从而分配一块连续的内存空间。这种操作对于有效地管理内存是至关重要的。了解如何使用 dup 设置内存空间,将使我们能够更灵活地处理程序中的数据结构,提高代码的可读性和可维护性。


一、汇编语言中数据位置的表达


1.1 汇编中有哪几种数

当我们谈论汇编语言时,有几个关键的概念需要理解:立即数(Immediate Data,idata)、寄存器(Register)、内存(Memory)、段地址(Segment Address,SA)和偏移地址(Effective Address,EA)。


1.立即数(idata):

立即数是一个直接给定的数值,它被直接包含在指令中。当我们在汇编指令中看到像 mov ax, 5 这样的语句时,其中的 5 就是一个立即数。这个数是直接提供给指令的,而不是从寄存器或内存中读取的。


2.寄存器(Register):

寄存器是计算机中的小型存储单元,可以快速存储和检索数据。在汇编语言中,我们使用寄存器来执行各种操作,如存储临时数据、进行运算等。例如,mov ax, 5 中的 ax 就是一个寄存器。


3.内存(Memory):

内存是计算机用于存储数据和程序的地方。在汇编语言中,我们可以通过使用内存地址来读取或写入数据。例如,mov ax, [bx] 意味着将 bx 寄存器中的地址指向的内存数据加载到 ax 寄存器中。


4.段地址(Segment Address,SA):

由于早期计算机硬件的限制,内存被划分为许多段。段地址是一个指向这些内存段的地址。在汇编语言中,我们通常使用段寄存器(如 ds、cs 等)来存储段地址。


5.偏移地址(Effective Address,EA):

偏移地址是相对于段地址的位移量,用于唯一标识内存中的特定位置。例如,在指令 mov ax, [bx+2] 中,[bx+2] 就是一个偏移地址,它告诉计算机从 bx 寄存器中的地址开始,向后偏移2个单位,找到数据的位置。


总体来说,汇编语言通过使用寄存器、立即数、内存段地址和偏移地址来执行各种计算机操作。理解这些概念对于编写和理解汇编语言程序至关重要。


1.2 指令要处理的数据有多长?

字word操作

mov ax,1
mov bx,ds:[0]
mov ds,ax
mov ds:[0],ax
inc ax
add ax,1000


mov ax,1:


意思是将寄存器 ax 的值设置为 1。

通俗来说,就是给 ax 寄存器赋值为 1。

mov bx,ds:[0]:


意思是将 ds 段的偏移地址为 0 的内存数据加载到寄存器 bx 中。

通俗来说,就是把 ds 段中存储的数据(在偏移地址为 0 处)取出来,放到 bx 寄存器里。

mov ds,ax:


意思是将 ax 寄存器的值设置为新的 ds 段地址。

通俗来说,就是把 ax 寄存器的值作为新的数据段地址。

mov ds:[0],ax:


意思是将 ax 寄存器的值存储到 ds 段的偏移地址为 0 的内存位置。

通俗来说,就是把 ax 寄存器的值放到 ds 段中偏移地址为 0 的地方。

inc ax:


意思是将 ax 寄存器的值增加 1。

通俗来说,就是把 ax 寄存器的值加 1。

add ax,1000:


意思是将 ax 寄存器的值加上 1000。

通俗来说,就是把 ax 寄存器的值加上 1000。


字节byte操作

mov al,1
mov al,bl
mov al,ds:[0]
mov ds:[0],al
inc al
add al,100


mov al,1:


将寄存器 al 的值设置为 1。

换句话说,就是给 al 寄存器赋值为 1。

mov al,bl:


将寄存器 bl 的值复制到寄存器 al。

这行代码的效果是,al 的值变成了和 bl 寄存器相同。

mov al,ds:[0]:


从 ds 段的偏移地址为 0 的内存位置读取数据,然后将其存储到寄存器 al 中。

换句话说,就是把 ds 段中偏移地址为 0 的数据读取到 al 寄存器中。

mov ds:[0],al:


将寄存器 al 的值存储到 ds 段的偏移地址为 0 的内存位置。

换句话说,就是把 al 寄存器的值写入到 ds 段中偏移地址为 0 的地方。

inc al:


将 al 寄存器的值增加 1。

换句话说,就是把 al 寄存器的值加 1。

add al,100:


将 al 寄存器的值加上 100。

换句话说,就是把 al 寄存器的值加上 100。


用word ptr或byte ptr指明

mov word ptr ds:[0],1
inc word ptr [bx]
inc word ptr ds:[0]
add word ptr [bx],2


mov byte ptr ds:[0],1
inc byte ptr [bx]
inc byte ptr ds:[0]
add byte ptr [bx],2

mov word ptr ds:[0],1:


将值 1 存储到 ds 段的偏移地址为 0 的内存位置。

换句话说,就是把数字 1 放到 ds 段中偏移地址为 0 的地方,而且因为是 word ptr,表示存储的是一个字(16位)的数据。

inc word ptr [bx]:


将 bx 寄存器所指向的内存位置中的值增加 1。

换句话说,就是把 bx 寄存器指向的内存中的数据(假设是一个字),增加 1。

inc word ptr ds:[0]:


将 ds 段的偏移地址为 0 的内存位置中的值增加 1。

换句话说,就是把 ds 段中偏移地址为 0 的数据(假设是一个字),增加 1。

add word ptr [bx],2:


将 bx 寄存器所指向的内存位置中的值增加 2。

换句话说,就是把 bx 寄存器指向的内存中的数据(假设是一个字),增加 2。

总体来说,这段代码涉及了内存中的数据存储和读写操作,以及对存储在内存中的值进行递增和加法运算。 word ptr 表示每次操作的是一个字的数据,而 ds:[0] 则指明了内存位置。


二、div指令


2.1 div介绍

div是除法指令,使用div作除法的时候

被除数:(默认)放在AX 或 DX和AX中

除数:8位或16位,在寄存器或内存单元中

结果:……


2.2 当除数为不同大小时

除数为8位

当除数为8位,被除数为ax里面的值

除法的位数示例

6879H÷A2H:商A5,余FH


除数为16位

当除数为16位,被除数为ax和dx里面的值

除法的位数示例

12345678H÷2EF7H:

商633AH,余2D82H

那么使用ax和dx一起的要这样:

(dx)*10000H+(ax)除数为这样算


2.3 示例

811d9292180b4e4aab7fdd9b947f9aa2.png


三、dup设置内存空间


3.1 dup指令是什么?

在汇编语言中,dup 是一种伪操作符,用于在程序中为数组或缓冲区分配内存空间。它通常与 times 操作符一起使用。


具体而言,dup 用于重复一段数据或变量的定义多次,从而分配一块连续的内存空间。这在创建数组或缓冲区时非常有用。


3.2 示例

指令 功能 相当于

db 3 dup (0) 定义了3个字节,它们的值都是0 db 0,0,0

db 3 dup (0,1,2) 定义了9个字节,由0、1、2重复3次构成 db 0,1,2,0,1,2,0,1,2

db 3 dup (‘abc’,’ABC’) 定义了18个字节,构成’abcABCabcABCabcABC’ db ‘abcABCabcABCabcABC


3.3 dup的使用格式

db 重复的次数 dup (重复的字节型数据)

dw 重复的次数 dup (重复的字型数据)

dd 重复的次数 dup (重复的双字数据)


总结


汇编语言是一门强大而底层的编程语言,深入了解其中的概念对于编写高效的程序至关重要。通过了解数据的存储方式、掌握 div 指令实现除法运算的原理,以及使用 dup 操作符设置内存空间,我们能够更好地理解和运用汇编语言的特性,从而写出更为优雅和高效的代码。希望本文能够为你打开汇编语言的一扇门,让你更深入地了解计算机底层的运行原理。

目录
打赏
0
1
1
0
61
分享
相关文章
kafka 的数据是放在磁盘上还是内存上,为什么速度会快?
Kafka的数据存储机制通过将数据同时写入磁盘和内存,确保高吞吐量与持久性。其日志文件按主题和分区组织,使用预写日志(WAL)保证数据持久性,并借助操作系统的页缓存加速读取。Kafka采用顺序I/O、零拷贝技术和批量处理优化性能,支持分区分段以实现并行处理。示例代码展示了如何使用KafkaProducer发送消息。
Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
通过上述讲解和代码示例,您可以理解和实现Linux系统中的进程间通信机制,包括共享内存、消息队列和信号量。这些机制在实际开发中非常重要,能够提高系统的并发处理能力和数据通信效率。希望本文能为您的学习和开发提供实用的指导和帮助。
199 20
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
137 12
“四两拨千斤” —— 1.2MB 数据如何吃掉 10GB 内存
一个特殊请求引发服务器内存用量暴涨进而导致进程 OOM 的惨案。
137 14
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
1775 2
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
294 1
|
5月前
|
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
面试官:POI大量数据读取内存溢出?如何解决?
【10月更文挑战第14天】 在处理大量数据时,使用Apache POI库读取Excel文件可能会导致内存溢出的问题。这是因为POI在读取Excel文件时,会将整个文档加载到内存中,如果文件过大,就会消耗大量内存。以下是一些解决这一问题的策略:
741 1
JVM简介—1.Java内存区域
本文详细介绍了Java虚拟机运行时数据区的各个方面,包括其定义、类型(如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和直接内存)及其作用。文中还探讨了各版本内存区域的变化、直接内存的使用、从线程角度分析Java内存区域、堆与栈的区别、对象创建步骤、对象内存布局及访问定位,并通过实例说明了常见内存溢出问题的原因和表现形式。这些内容帮助开发者深入理解Java内存管理机制,优化应用程序性能并解决潜在的内存问题。
JVM简介—1.Java内存区域
JVM实战—2.JVM内存设置与对象分配流转
本文详细介绍了JVM内存管理的相关知识,包括:JVM内存划分原理、对象分配与流转、线上系统JVM内存设置、JVM参数优化、问题汇总。
JVM实战—2.JVM内存设置与对象分配流转

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等