首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

x86汇编加载用户程序-4-2

16 位操作数与 AX 寄存器的乘法; 下述语句实现 AL 乘以 BL,乘积存放在 AX 。...源程序编译时,编译器会保留一段内存区域,用来存放编译后的内容。当它看到这条伪指令时,它仅仅是跳过指定数量的字节,而不管里面的原始内容是什么。...显卡文本模式下25x80,换行就是+80,移动到行首就是 除以80取商再乘以80 疑问 汇编有函数? 一下是我的理解,有如果错误欢迎批评指正。...由于错把标号当作一个函数的缘故,导致写这段程序没有注意到顺序, .put_other和.set_cursor的标号里的内容调换了位置,结果程序在运行了put_other标号下最后一条指令会执行start...,80 jmp .roll_screen .put_other: mov ax,0xb800 mov es,ax ; 一个字符显存对应两个字节

53430

NASM Overview

rest 以十字为单位声明一段初始化数据 reso 以 oword 为单位声明一段初始化数据 resy 以 yword 为单位声明一段初始化数据 incbin:包含二进制文件 NASM 提供了一种包含二进制文件的方法...4 bytes) 为边界对齐; section 不能出现重叠; NASM 为每个 section 提供了一个隐藏标签 section....mul 指令可以通过寄存器内存单元接受一个 8 位或 16 位的乘数: 如果乘数是 8 位的:那么源操作数与寄存器 AL 的 8 位数相乘得到的结果存储 AX ; 如果乘数是 16 位的:那么源操作数与寄存器...除数作为源操作数传入,存储寄存器内存单元。 被除数默认存放在 AX(16 位以内)或 AX 和 DX(32 位,DX 存放高位,AX 存放低位)。 div 操作的结果分为商和余数两部分。...cwd cwd 寄存器 AX 数据的最高位拓展到 DX,若 AX 中最高位为 0,则 DX 被设置为 0000H,若 AX 的最高位为 1,则 DX 被设置为 FFFFH。

2.8K20
您找到你想要的搜索结果了吗?
是的
没有找到

x86汇编加载用户程序-4-1

SECTION Intel 处理器要求段在内存的起始物理地址起码是 16 字节对齐的。这句话的意思是,必须是16 的倍数,或者说该物理地址必须能被 16 整除。...外围设备访问-磁盘 外围设备和处理器间通信是通过相应的I/O接口的.端口是处理器和外围设备通过 I/O 接口交流的窗口,每个I/O接口可能有好几个端口,端口就相当于寄存器,所以可能是8位或是16位也有32...端口不同计算机有不同实现方式,分别是内存映射和独立编址。x86是端粒编址的。 主硬盘接口分配的端口号是 0x1f0~0x1f7,副硬盘接口分配的端口号是 0x170~0x177。...调用前,我们要把可能会影响到的寄存器值push进堆栈, call的指令执行结束后(用ret,或retf), pop到原寄存器内。 有四种调用方式。...逻辑右移指令 用逻辑右移指令 shr(SHift logical Right)寄存器 AX 的内容右移 4 位。

53410

《一个操作系统的实现》笔记(1)--NASM汇编语法和环境搭建

install build-essential nasm 这里的build-essential软件包包含GCC和GNU Make。...使用Bochs调试Linux kernel,赵炯的《linux内核完全剖析》也有介绍。 ?...一旦BIOS发现了引导扇区,就会将这512字节的内容装载到内存地址0000:7c00处,然后跳转到0000:7c00处控制权彻底交给这段引导代码。...NASM,任何不被方括号括起来的标签或变量名都被认为是地址,访问标签的内容必须使用[ ]。 一个简单的boot程序,开机后显示红色的”Hello,OS world!”...当二进制数据不同的电脑上传输时(不管来自文件还是网络)。 2. 当二进制数据作为一个多字节整形写入到内存然后当作单个单个字 节读出,反之亦然。

3.9K52

NASM语法

'MS-DOS'下,尽管有办法,但要把程序的标准错误输出重定向到一个文件还是非常困 难的。因为NASM 常把它的警告和错误信息输出到标准错误设备,这将导致文本编 辑器里面很难捕捉到它们。...比如,下面的命令语句: nasm myfile.asm -dFOO=100 -uFOO 会导致'FOO'不是一个程序预定义的宏。...这样的话, 如果你想到链接进来的其他模块定义了一个符号叫'eax',你可以用'$eax' NASM 代码引用它,以和寄存器的符号区分开。...指令操作数可以使用一定的格式:它们可以是寄存器,仅仅以寄存器名来表示(比 如:'ax','bp','ebx','cr0':NASM 不使用'gas'的语法风格,在这种风格寄存器名 前必须加上一个'%...this sets st1 := st1 + st0 fadd to st1 ; so does this 几乎所有的浮点指令引用内存时必须使用以下前缀的一个

1.9K20

用Rust实现Brainfuck的JIT编译器

通常, NASM 程序分为几个段(section),在这篇文章,我们遇到以下两个段: 数据段:data section 文本段:text section 数据段部分用于声明常量,此数据在运行时不会更改...但是,在哪里可以获取该运算的数据,是内存?从内存读取数据并将数据写回到内存中会减慢处理器的速度,因为它涉及通过控制总线发送数据请求的复杂过程。因此,CPU 具有自己的内部存储器,称为寄存器。...因此,当我们编写 mov rax, 1 时,意味着 1 放入 rax 寄存器。...# 42 您会注意到,代码中使用 mmap() 分配内存,而不是使用 malloc() 从堆获取内存的常规方法。这是必需的,因为我们需要内存是可执行的,因此我们可以跳转到它而不会导致程序崩溃。...根据 nasm 规范,函数的第一个参数被存在 rdi 寄存器,第二个参数被存在 rsi 寄存器。我们将它们复制到 r12 和 r13 这两个寄存器内持久化存储。

81910

从裸机启动一个C++程序实战操作

笔者也曾尝试到一些系统讲解底层的书籍寻找答案,但也发现,它们各自突出的领域中讲解地很详细,但对于上下层串联的部分却总是有缺失,导致各个领域的知识是破碎的,难以关联在一起,以建立一个更加宏观的体系。...例如虚拟机要执行「内存0x10数据读取到rax寄存器」这样的指令,通过虚拟化API,CPU会真实地执行一条从内存读取数据放到寄存器的指令。...内存,全称「内部存储器」,英文名称是「Internal Memory」,又被称为「主存」。之所以叫「内」,这也是有历史原因的。因为早年,内存并不是一个独立的硬件,而是直接内存颗粒焊死主板上的。...GPU集成主板上的叫做「板载显卡」,GPU集成CPU的叫做「核心显卡」。不过板载显卡已经被淘汰了,目前如果你的电脑中没有独显的话,那一定是核显。...而在计算机体系,存储单元一般不会按二进制位(bit)来编址,而是按照字节(Byte),也就是说,每8个bits为一组,编一个地址。那么地址总线是3的CPU,就可以访问8字节的内存空间。

45932

从hex_encode起利用SIMD向量指令引入PgVA aka PostgresVectorAcceleration(一)

:这确保满足快速执行的要求(例如缓冲区大小),并且不需要像在库例那样重复检查 7) 通过避免等待延迟来保持向量化执行端口一直在做有用的工作 8) 以cache line方式访问内存(从输入缓冲区读取,...NASM obj输出格式的操作系统:包括Linux和windows 3) 算法使用先进技术(常量和临时寄存器)来避免大多数不必要的内存访问:汇编实现让您可以完全控制寄存器(与内联函数不同) 4) 多个依赖链交错工作以最大程度减少延迟...:编码通常穿插并使用几乎所有可用的寄存器 5) 一些指令(moves、zeroing)处理器执行端口外执行:这些不消耗执行周期但是需要考虑他们的延迟 6) 一些向量指令(乘加)的延迟是5,例如,这意味着指令发出后...,以便能够最后一轮超越:尽管如此,正确的工作量返回给调用者,并且实际结果之后的输出缓冲区的向量大小清零 12) 循环可能会在输入缓冲区之后预加载一些数据,但确保永远不会超过以下页面边界以避免任何访问冲突...:这对内存系统没有伤害,因为输出缓冲区最后由一个补充缓冲区,但这可能如果认为不支持,则更改为尾部处理留给标准实现。

46420

Debug常用命令:

汇编语言学习笔记 Debug常用命令: ​ 1、R 可查看、改变CUP寄存器的内容 ​ 2、D 查看内存的内容 ​ 3、E 改写内存的内容 ​ 4、U 内存的机器指令翻译成汇编语言 ​...mov eax, 42 ; 立即数42赋值给eax寄存器 mov ebx, eax ; eax寄存器的值复制到ebx寄存器 lea:用于计算一个有效地址,并将该地址存储目标寄存器。...lea ecx, [ebx+4] ; ebx寄存器加上4得到的地址存储ecx寄存器 add:执行加法操作。...格式化字符串漏洞:格式化字符串漏洞是指当程序使用用户提供的格式化字符串函数(如printf)时正确处理用户输入,从而导致信息泄漏或任意内存读写。...编译汇编代码:终端,使用以下命令汇编代码编译为目标文件: nasm -f elf64 -o program.o program.asm 上述命令,-f elf64表示生成64位可执行文件,如果你的代码是

9810

Debug常用命令:

汇编语言学习笔记 Debug常用命令: ​ 1、R 可查看、改变CUP寄存器的内容 ​ 2、D 查看内存的内容 ​ 3、E 改写内存的内容 ​ 4、U 内存的机器指令翻译成汇编语言 ​...mov eax, 42 ; 立即数42赋值给eax寄存器 mov ebx, eax ; eax寄存器的值复制到ebx寄存器 lea:用于计算一个有效地址,并将该地址存储目标寄存器。...lea ecx, [ebx+4] ; ebx寄存器加上4得到的地址存储ecx寄存器 add:执行加法操作。...格式化字符串漏洞:格式化字符串漏洞是指当程序使用用户提供的格式化字符串函数(如printf)时正确处理用户输入,从而导致信息泄漏或任意内存读写。...编译汇编代码:终端,使用以下命令汇编代码编译为目标文件: nasm -f elf64 -o program.o program.asm 上述命令,-f elf64表示生成64位可执行文件,如果你的代码是

15910

编译过程的并行性优化概述

SIMD 扩展部件能够对多媒体程序的数据进行并行处理,提升了多媒体程序的运行速度;特定的微处理器体系结构上,SIMD 扩展指令允许原来需要多次装载的内存地址连续的数据一次性装载到向量寄存器,通过一条...内存访问依赖 如果两个不同的内存访问指向同一个位置,就有可能存在内存访问之间的依赖关系。...寄存器使用与并行性的折衷 并行分析和调度的机器无关中间表示所使用的无限多个伪寄存器必须被映射到目标机器上的有限寄存器;而把几个伪寄存器映射到同一个物理寄存器会生成一定的存储依赖,导致限制了指令级的并行性...为了更好地利用机器资源,我们还可以考虑一些指令从一个基本块移动到另一个基本块的代码调度,这种策略就称为全局调度。...由于部分体系结构的 SIMD 指令只能从内存存取连续对齐的数据,因此当程序存在不对齐或不连续内存引用时需要通过移位或者重组等辅助指令才能组成向量。

74250

深入理解计算机系统 第三章 笔记

AX 寄存器称为累加器,常用于存放算术、逻辑运算的操作数或结果。另外,所有的I/O指令都要使用累加器与外设接口传递数据。 BX 寄存器称为基址寄存器,常用来存放访问内存时的地址。...注:x86-64增加了限制,两个操作数不能同时指向内存 一个值从内存位置复制到另一个内存位置需要两条指令: 第一条 源指令加载到寄存器 第二条 寄存器值写入目的位置 注:movl 指令以寄存器作为目的时...shell 程序,给攻击者提供一组操作系统函数 另一种攻击形势,攻击代码会执行一些授权的任务修复对栈的破坏,然后第二次执行 ret 指令,表面上正常返回到调用者 知名病毒: 蠕虫病毒 蠕虫可以自己运行...页 (page),典型的每页是 2048 或者 4096 字节 系统允许控制三种访问形式:读 (从内存读数据)、写 (写数据到内存)、执行 (内存的内容看做机器级代码) 以前,x86体系结构读和执行访问控制合并成了一个...现在,内存保护引入了 NX (No-Execute) 位,读和执行访问模式分开 及时编译 技术为解释语言 (Java) 编写的程序动态地产生代码,以提高执行性能 是否能够将可执行代码限制由编译器创建原始程序时产生的那个部分

60030

体系结构复习笔记

所有物理资源只能使用特权指令进行访问:包括页表和其他状态信息,中断控制,I / O寄存器(系统调用例外) 11.4 虚拟内存 内存用作辅助(磁盘)存储的“缓存”,由CPU硬件和操作系统(OS)...页面错误时,必须从磁盘获取页面:需要数百万个时钟周期,由操作系统代码处理 11.6 页表(Page Tables) CPU的页表寄存器指向物理内存的页表 页表条目数组,由虚拟页码索引 如果内存中有页面...(Compulsory misses)(冷启动命中):首次访问块 容量缺失(Capacity misses):由于缓存大小有限,稍后再次访问替换的块 冲突命中(Conflict misses):非完全关联的缓存...、基址加变址寻址、相对基址加变址寻址这些寻址方式内存的数据移入寄存器。...扫描过程,链接器维护一个可重定位目标文件集合E、一个解析(即已引用但尚未定义)的符号集合U、一个已定义的符号集合D 缺点: 存储时磁盘空间存在大量冗余 运行时内存空间存在大量冗余 库更新导致所有程序需要显示重新链接

2.4K30

64 位 Windows 操作系统的内核特权级别提升

当进程尝试执行诸如打开文件等各种操作时,系统将对令牌的账户权限和特权级别与要求的特权级别作比较,以决定该访问应被允许或拒绝。..._EX_FAST_REF 结构是依赖于假设内核数据结构被要求在内存以16字节边界对齐的一种策略。...这在内核调试器由于其假定下一条指令在内存只有 1 字节而不是 2 字节引发问题。...如果可以通过断点命中之后的 1 字节手动调整 RIP 寄存器,问题将会被解决,但最好的方法是首位置通过 db 0cch 指令只生成正确的操作码。...我不确保是否一直是这种情况,并且我相信 x64 系统它必须在内核内存同时使用 LARGE PAGE,其使内存保护失效(内存只能够虚拟内存页面大小的粒度被设置为非可执行)。

60940

程序的编译、链接、装载与运行

程序的运行过程,CPU发现有些内存物理内存并不存在并因此触发缺页异常,此时CPU控制权限转交给操作系统的异常处理函数,操作系统负责将此内存页的数据从磁盘上读取到物理内存。...通过上面的Linux内存分布图我们可以知道,内存的栈是向下增长的。x86esp寄存器用于保存当前进程的栈顶的地址,push元素到栈,esp的值减小;从栈pop元素,esp的值增大。...中断处理函数从寄存器 eax 获取到系统调用编号,根据系统调用编号找到指定的系统调用函数 系统调用函数从约定好的寄存器获取所需参数,系统调用函数根据参数开始执行 系统调用执行完毕后,系统调用的结果存放在用户程序有权访问的区域...(寄存器内存) 系统调用返回,控制权重新交给用户程序 用户程序从指定区域获取系统调用的结果,系统调用结束 用户写C语言时并不会手动的调用系统调用,它们一般都被封装在库函数。...(真是奸商啊) 一旦旅行团中有人开始找某个旅客,但是这个旅客已经被移到了仓库,旅店老板就会赶紧把这个人从仓库回到某个房间中,然后改变地图,让同一个旅行团的人能成功的房间中找到这个旅客。

1.3K10

ARM汇编语言指令集汇总

ARM汇编语言指令集汇总 跳转指令 存储器和寄存器交互数据指令(内存访问) 数据传送指令 数据算术运算指令 数据逻辑运算指令 比较指令 组合和分离指令 并行指令 测试指令 ThumbEE指令 协处理器指令...BXJ 跳转,更改为 Jazelle TBB , TBH 表跳转字节、半字 存储器和寄存器交互数据指令(内存访问) ➡️ 代表从左到右 ⬅️ 代表从右到左 指令 简介 LDR 从存储器中加载数据到寄存器...CLREX 独占清零,清除执行处理器的局部记录:有地址请求进行独占访问 数据传送指令 指令 简介 MOV 立即数或寄存器的数据传送到目标寄存器 ⬅️ MOV R1,R0 寄存器R0的值传送到寄存器...Rm 的值向右循环 RRX 可提供经右移一位后的寄存器的值 比较指令 指令 简介 CMP 直接比较 CMP R0 #0 R0寄存器的值和0比较 CMN 负数比较指令 CMN R1,R0 寄存器...MCRR2 从寄存器动到协处理器 LDC、LDC2、STC、STC2 在内存和协处理器之间传送数据,加载协处理器 伪指令 指令 简介 ADRL 将相对于程序或相对于寄存器的地址载入寄存器(中等范围

1.2K20

Android客户端性能异常类

超时的原因: UI线程block的操作; IO/数据库/网络耗时操作; 复杂不合理的布局; overdraw的过度绘制; 内存使用异常导致的卡顿,例如内存抖动或泄露等导致GC的次数增多,消耗GC的时间长...,CPU绘制时间会短; 不合理的异步(会导致CPU占用互斥资源); 崩溃 (Crash) 某些场景下,满足的条件未满足或者需要的资源没有拿到,出现的预期的运行时异常。...SEGV_MAPERR:当前执行的指令访问内存地址映射到当前进程地址空间 SEGV_ACCERR:当前执行的指令访问内存地址无访问权限(读、写、执行) SEGV_MAPERR: 字符串溢出:寄存器不够存储字符串长度...空对象:底层某个对象null了 PC跑飞:一般是程序(PC寄存器)跑飞或者栈(SP寄存器)被破坏 SIGBUS 非法地址,包括内存地址对齐出错,比如访问一个4字节的整数, 但其地址不是4的倍数。...细分为: BUS_ADRALN:当前执行的指令访问内存地址不符合指令的对齐规范 这类异常通常是内存踩踏导致的偶现的随机问题,概率极小 BUS_ADRERR:当前执行的指令访问的文件映射地址的缺页异常错误

3.9K10

C++初阶-类和对象上

2、结构体内存对齐规则 九、this指针 1、this指针引入 2、this指针的特性 3、相关面试题 一、前言 主要讲解点: 本章开启C++类和对象的学习和讲解,这里是起点之章,为之后的深入掌握类和对象打基础...概念: 对于类对象大小的计算,计算的是成员变量的大小,也需要满足结构体内存对齐的规则(便于提高读取效率) 对齐规则: 第一个成员与结构体偏移量为0的地址处 其他成员变量要对齐到某个数字...(含嵌套结构体的对齐数)的整数倍 注意: 对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值 VS默认的对齐数为8 ,linux默认对齐数是4 相关面试题:为什么要进行内存对齐...原因在于,为了访问对齐内存,处理器需要作两次内存访问;而对齐内存访问仅需要一次访问 九、this指针 1、this指针引入 引入背景: 对于对象调用成员函数,函数需要区分不同对象找到对象自身进行操作...并把获取的首地址存放在了寄存器ECX(VC++编译器是放在ECX,其它编译器有可能不同)。也就是成员函数的其它参数正常都是存放在栈。而this指针参数则是存放在寄存器

46150

内存对齐

,为了访问对齐内存,处理器需要作2次内存访问,而内存对齐就只需要一次访问 64位字的安全访问保证 x86-32上,64位函数使用Pentium MMX之前不存在的指令。...非Linux ARM上,64位函数使用ARMv6k内核之前不可用的指令 ARM、x86-32和32MIPS上,调用方有责任安排对原子访问的64位字对齐。...Go语言称为寄存器宽度的这个值,就可以理解为机器字长,也是平台对应的最大对齐边界,而数据类型的对齐边界是取类型大小与平台最大对齐边界的较小的那个 类型 大小 RegSize int8 1 byte...假如不扩张到对齐边界的整数倍,这个结构体大小就是22字节,如果要使用长度为2的T类型数组,按照元素类型大小,会占用44字节,就会导致于第二个元素并没有内存对齐 所以只有每个结构体的大小是对齐值的整数倍...golangci-lint 检测对齐 golangci-lint run –disable-all -E maligned 结论 内存对齐是为了cpu更高效的访问内存的数据 结构体对齐依赖类型的大小保证和对齐保证

83721
领券