首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏xingoo, 一个梦想做发明家的程序员

    汇编语言 手记5

    段寄存器就是提供段地址的。 8086CPU有4个段寄存器 CS DS SS ES 当8086CPU要访问内存时,由这4个段寄存器提供内存单元的段地址。 CS(代码寄存器)和IP(指令指针寄存器)是80

    1.1K60发布于 2018-01-17
  • 来自专栏Linux驱动

    汇编指令-CMP、TEQ(5)

    该文介绍了CMP和TEQ指令的功能和用法,以及相关的操作数、操作符和标志位。

    1.7K100发布于 2018-01-03
  • 来自专栏Android点滴分享

    汇编学习(5),函数,栈帧

    本篇介绍 本篇介绍下汇编中的函数,栈帧内容。 函数 汇编也支持函数调用,如下是一个例子: extern printf section .data radius dq 10.0

    69710编辑于 2022-12-07
  • 来自专栏乱码三千

    汇编语言之MIPS汇编

    MIPS汇编中的分段处理 .data #数据段 .text #代码段 传送指令 加载立即数指令 li li(load immediate) :用于将立即数传送给寄存器 li $t0,1 ;十六进制数据使用 f12 = double to print print string 4 $a0 = address of null-terminated string to print read integer 5 io控制台显示光标,可输入数字,回车后将输入的数字保存在$v0中 move $t0,$v0 #由于接下来还需要使用$v0 ,为避免数据被覆盖掉 将输入的数据转移到$t0中进行临时保存 li $v0,5 #需求:实现int a[3][3] = {{1, 2, 3}, {5, 6, 7}, { 10, 11, 12}}; #以下是以 行不动 列轮动的方式实现 .data da: .word 1,2,3,5,6,7,10,11,12 6, 7}, { 10, 11, 12}}; .data da: .word 1,2,3,5,6,7,10,11,12 # 假如以上数据是动态写入的 当做数组中的数据来用 .text

    10.6K31发布于 2021-08-24
  • 来自专栏Android点滴分享

    汇编学习(1),汇编之helloworld

    本篇介绍 本篇作为汇编系列的开篇,就先研究下汇编如何写helloworld。 信息,-F dwarf用来指定debug信息格式是dwarf,-l用来生成机器码和汇编的对应文件。 汇编程序一般由data,bss,text 3个段构成, 前面加section就是定义这是某个段。 0 3 00000009 726C6400 4 section .bss 5 这样就完成了汇编helloworld的学习了。

    1.2K40编辑于 2022-11-28
  • 来自专栏c++与qt学习

    汇编语言--高级汇编技术

    汇编语言--高级汇编技术 子程序的封装 程序的多文件组织 汇编指令汇 数据传送指令 算术指令 逻辑指令 串处理指令 控制转移指令 处理机控制与杂项操作指令 汇编伪操作汇 处理机选择伪操作 段定义伪操作 程序开始和结束伪操作 数据定义及存储器分配伪操作 表达式赋值伪操作 地址计数器与对准伪操作 基数控制伪操作 汇编操作符汇总 算术操作符 逻辑和移位操作符 关系操作符 数值回送操作符 属性操作符 汇编过程 .exe的诞生 程序运行步骤及生成的文件 汇编过程 宏汇编 C语言中的预处理命令 汇编中的宏---由C中的宏定义说起 举例 语法和术语 子程序VS宏定义 宏中的局部标号 变元是操作码的一部分 宏库 条件汇编 举例 重复汇编: 用于连续产生完全相同或者基本相同的一组代码 不定重复伪操作IRP 不定重复伪操作IRPC 80X86汇编 80x86 cpu性能一览 80x86寄存器结构 80x86寻址方式 80x86 TABLE DB 'ABCD' ---- 属性操作符 ---- 汇编过程 .exe的诞生 ---- 程序运行步骤及生成的文件 ---- 汇编过程 ---- 宏汇编 C语言中的预处理命令 -

    2.2K31编辑于 2022-07-12
  • 来自专栏Republic博客

    汇编语言_汇编语言程序

    可以来看一段汇编源程序 assume cs:codesg codesg segment mov ax,0123h mov bx,0456h add ax,bx add ax,ax mov ax,4c00h int 21h codesg ends end 开头和结尾的两句代表伪指令 只有编译器可以读懂 汇编指令可以被翻译为机器码最终被cpu执行 汇编程序 就是包含汇编指令和伪指令的文本 mov ax,4c00h int 21h 跟C语言程序的return 0一样 返回控制权 一个汇编程序是由多个段组成的 这些段被用作各种空间来使用 一个有意义的汇编程序至少需要一个段 且每个段都需要段名 段名 segment- -段的开始 段名 ends--段的结束 assume假设 含义是假设某一段寄存器和程序中我们定义的段名关联起来 可以理解为和变量的引用一个意思 利用汇编程序计算2^3 assume cs:code code segment mov ax,2 add ax,ax add ax,ax code ends end 汇编程序的编写不是我学习的重点,这里直接跳过 需要的可以自己去看一下 [...]的规定与(

    95120编辑于 2023-11-14
  • 来自专栏逆向技术

    汇编知识扫盲之常见汇编指令

                   汇编知识扫盲之常见汇编指令 一、数据传输指令     它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.   1. 通用数据传送指令.         JECXZ     ECX为零时转移. 4>中断指令     INT  中断指令     INTO  溢出中断     IRET  中断返回 5>处理器控制指令     HLT  处理器暂停,

    2K20发布于 2019-05-25
  • 来自专栏HelloCode开发者学习平台

    汇编(三)

    对于arm64系的CPU来说, 如果寄存器以x开头则表明的是一个64位的寄存器,如果以w开头则表明是一个32位的寄存器,在系统中没有提供16位和8位的寄存器供访问和使用。其中32位的寄存器是64位寄存器的低32位部分并不是独立存在的。

    84010编辑于 2023-03-23
  • 来自专栏若尘的技术专栏

    初学汇编

    什么是汇编器和链接器? 汇编器(assembler):用于将汇编语言源程序转换为机器语言 链接器(linker):一种工具程序,把编译器生成的单个文件组合成一个可执行文件 寄存器(register):是 CPU 中被命名的存储位置 汇编语言于机器语言是一对一(one-to-one)的关系:每一条汇编语言指令对应一条机器语言指令。 C++ 和 Java 与汇编语言有什么关系? 汇编语言是不可移植的。因为它是为特定处理器系列设计的。汇编语言会直接与计算机体系结构相匹配。 汇编语言有规则吗? 大多数汇编语言规则都是以目标处理器及其机器语言的物理局限性为基础的。如:CPU 要求两个指令操作数的大小相同。汇编语言的规则较少。

    1.4K117发布于 2021-05-22
  • 来自专栏HelloCode开发者学习平台

    汇编(七)

    函数的局部变量 接下来我们新建项目,在main.m文件中写下如下代码 断点断住sum函数.我们看看sum函数内部的汇编. 我们可以看到.sp拉伸了16个字节. 接下来我们修改一下代码在看看sum函数的汇编 接来下sum函数里面.栈拉伸了32个字节(ARM64中对sp的操作是16字节对齐的,也就是16的整数倍). 我们来看下下面的案例: 从汇编可以看出.我们一旦是嵌套调用,就立刻多开辟了16个字节的空间. 因为只要是嵌套调用,我们需要保护x29和x30两个寄存器(本函数调用的返回地址,"回家的路").

    60620编辑于 2023-03-23
  • 来自专栏HelloCode开发者学习平台

    汇编(二)

    寄存器 内部部件之间由总线连接 对程序员来说,CPU中最主要部件是寄存器,可以通过改变寄存器的内容来实现对CPU的控制 不同的CPU,寄存器的个数、结构是不相同的 通用寄存器 ARM64拥有有31个64位的通用寄存器 x0 到 x30,这些寄存器通常用来存放一般性的数据,称为通用寄存器(有时也有特定用途) 那么w0 到 w28 这些是32位的. 因为64位CPU可以兼容32位.所以可以只使用64位寄存器的低32位. 比如 w0 就是 x0的低32位! 通常,CPU会先将内存中的数据存储到通用寄

    95320编辑于 2023-03-23
  • 5.7 汇编语言:汇编高效乘法运算

    汇编语言是一种面向机器的低级语言,用于编写计算机程序。汇编语言与计算机机器语言非常接近,汇编语言程序可以使用符号、助记符等来代替机器语言的二进制码,但最终会被汇编器编译成计算机可执行的机器码。 在汇编语言中,乘法指令通常是通过mul(无符号乘法)和imul(有符号乘法)这两个指令实现的。 但读者需要注意,在使用LEA计算乘法时必须要保证乘数是2的次幂,并且乘数的范围必须是2/4/8这三个区间才可使用该指令,我们使用汇编来实现计算eax*8+2其汇编指令如下。 edx就相当于5个eax2.计算 lea edx,[edx * 2 + edx] 这就相当于计算 edx = (5 * eax) * 2 + (5 * eax)3.计算 (5eax * 2) = 10eax 接着计算 (5 * eax) = 5eax 最后得出 10eax + 5eax4.经过该过程可得出 eax * 15 = 45 最终计算3*15=45得到最终结果.这个计算过程看似复杂,但如果将其转化为汇编指令那么只需要两条即可实现快速乘法运算

    67620编辑于 2023-08-23
  • 5.8 汇编语言:汇编高效除法运算

    计算时我们需要参考次方表,这里我列举出几个常用的次方数值:次方表: 1=>2 2=>4 3=>8 4=>16 5=>32 6=>64 7=>128次方表: 8=>256 9=>512 10=>1024 EAX 寄存器内.2.使用 sub eax,edx 指令将高位符号位通过减法减掉.3.使用 sar eax,x 指令完成算数右移除法运算.4.使用 neg eax 将计算后的正数反转为负数.这个过程通过汇编语言实现代码很简单 先来看一段汇编代码,我们此时已知 M = 055555556h 且 edx = N 带入公式 2^(32+N) / M 由于edx没有变化所以此处应计算 2^32 / 055555556h = 2.9999 即可计算出此处的除数是3,而被除数则是ecx寄存器内的值,我们即可得知该段汇编指令在进行 ecx / 3 的计算流程。 所以可得到当前除数是5mov ecx,dword ptr ds:[y] ; ecx = 10 / 5 = 2mov eax,066666667h ; 此处的M模值是编译器计算后得到的

    1.4K50编辑于 2023-08-23
  • 来自专栏程序技术知识

    汇编指令

    汇编指令: JO、JNO、JB、JNB、JE、JNE、JBE、JA、JS、JNS、JP、JNP、JL、JNL、JNG、JG、JCXZ、JECXZ、JMP、JMPE 名称 功能 操作数 操作码 模数 寄存器 无 无 无 无 8086 无 $6766 JMP 跳转 32[寄16] $FF 00 100 5 无 无 无 无 386 $66 $67 JMP 跳转 16[寄32] $FF 00 100 5 无 无 无 无 386 $67 $66 JMP 跳转 32[寄32] $FF 00 100 5 无 无 无 无 386 $6766 无 JMP 跳转 16[寄16+位移8] $FF 01 100 5 9 无 无 无 8086 无 $6766 JMP 跳转 32[寄16+位移8] $FF 01 100 5 9 无 无 无 386 $66 $67 JMP 跳转 16[寄32+位移8] $FF 01 100 5 9 5 9 无 无 无 8086 无 $6766 JMP 跳转 32[寄16+位移16] $FF 10 100 5 9 无 无 无 386 $66 $67 JMP 跳转 16[寄32+位移32] $FF

    2K10编辑于 2021-12-20
  • 5.1 汇编语言:汇编语言概述

    汇编语言是一种面向机器的低级语言,用于编写计算机程序。汇编语言与计算机机器语言非常接近,汇编语言程序可以使用符号、助记符等来代替机器语言的二进制码,但最终会被汇编器编译成计算机可执行的机器码。 内核安全:汇编语言是编写内核模块或驱动程序所必需的语言,例如,Linux内核中的大部分代码都是使用汇编语言实现的。因此,对于理解内核原理和进行内核安全研究来说,掌握汇编语言非常重要。 本章中所提到的汇编语言为Windows汇编,在Windows平台下读者可使用MASM工具对汇编语言进行编译测试,也可以使用通用的集成开发环境实现编译,笔者推荐使用RadASM工具,RadASM 是一个面向汇编编程的开发环境 ; 定义未初始化变量 var3 BYTE 0 ; 最小的无符号字节常量 var4 BYTE 255 ; 最大的无符号字节常量 var5 SBYTE -128 ; ; 1024字节的缓冲区 var5 BYTE "welcome",0dh,0ah,0 ; 0dh,0ah为换行符 有时我们需要计算一个指定数组的所占空间的大小,但手动计算显得特别麻烦,此时我们可以使用

    1.4K50编辑于 2023-10-11
  • 5.7 汇编语言:汇编高效乘法运算

    汇编语言是一种面向机器的低级语言,用于编写计算机程序。汇编语言与计算机机器语言非常接近,汇编语言程序可以使用符号、助记符等来代替机器语言的二进制码,但最终会被汇编器编译成计算机可执行的机器码。 在汇编语言中,乘法指令通常是通过mul(无符号乘法)和imul(有符号乘法)这两个指令实现的。 但读者需要注意,在使用LEA计算乘法时必须要保证乘数是2的次幂,并且乘数的范围必须是2/4/8这三个区间才可使用该指令,我们使用汇编来实现计算eax*8+2其汇编指令如下。 edx就相当于5个eax 2.计算 lea edx,[edx * 2 + edx] 这就相当于计算 edx = (5 * eax) * 2 + (5 * eax) 3.计算 (5eax * 2) = 10eax 接着计算 (5 * eax) = 5eax 最后得出 10eax + 5eax 4.经过该过程可得出 eax * 15 = 45 最终计算3*15=45得到最终结果.

    61520编辑于 2023-10-11
  • 5.6 汇编语言:汇编高效数组寻址

    汇编语言是一种面向机器的低级语言,用于编写计算机程序。汇编语言与计算机机器语言非常接近,汇编语言程序可以使用符号、助记符等来代替机器语言的二进制码,但最终会被汇编器编译成计算机可执行的机器码。 在汇编语言中,实现多维数组的寻址方式相对于C语言来说稍显复杂,但仍然可行。下面介绍一些常用的汇编语言方式来实现多维数组的寻址。 4字节中的5,指向第2个元素接着来解释一下上方汇编代码:1.第1条代码: 寄存器EAX是获取到的x的值,此处为C语言中的x=02.第2条代码: 其中0C代表一个维度的长度,每个数组有3个元素(3x4=0C 第5条指令: 左移4位,相当于2^4次方也就是16这一步相当于求sizeof(type[H])的值6.最后Array[M] + sizeof(type[H])的值求出Array[M][C]的值接下来我们通过汇编的方式来实现这个寻址过程 noneinclude windows.incinclude kernel32.incincludelib kernel32.lib.data MyArray DWORD 1,2,3,4,2,3,4,5,3,4,5,6,4,5,6,7,5,6,7,8,6,7,8,9,0h

    73330编辑于 2023-08-23
  • 来自专栏乱码三千

    汇编语言之ARM64汇编

    x29, #0x8] 偏移量为负的 将寄存器w0的值存入x29 - 0x8 的内存地址 [sp]: sp保存栈空间的地址值, [sp]表示取值,获取所对应的空间 和8086中的[bx]是类似的 另外 汇编简写 x0,#10、mov x1,#20 但是,mov指令不能用于设置pc的值,ARM64没有提供这样的功能 ARM64提供了另外的指令来修改PC的值,这些指令统称为转移指令,最简单的是bl指令 类似于x86汇编中的 arm代码示例 .text ;代码段 .global _A,_B ;定义两个全局函数 A和B _A: mov x0 ,#0xa0 ;arm汇编中数据用#开头 mov x1 ,#0x00 add #0x10 ret 既然sp一次最少拉伸16个字节, 那么以下函数需要拉伸多少空间: void sum(int a, int b){ int c=3; int c=4; int c=5; } 由于int类型的数据占用4个字节空间, 这里一共有5个int,那么需要占用5*4=20个字节的空间, 那么sp一次性拉伸0x20也就是32字节的栈空间 16位寄存器-->最大装2个字节数据-

    3.9K60发布于 2021-08-24
  • 来自专栏HelloCode开发者学习平台

    汇编(一)

    进制的定义 八进制由8个符号组成:0 1 2 3 4 5 6 7 逢八进一 十进制由10个符号组成:0 1 2 3 4 5 6 7 8 9逢十进一 N进制就是由N个符号组成:逢N进一 做个练习 1 进制的运算 做个练习 八进制运算 2 + 3 = __ , 2 * 3 = __ ,4 + 5 = __ ,4 * 5 = __. 277 + 333 = __ , 276 * 54 = __ , 237 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 这种二进制使用起来太麻烦,改成更简单一点的符号: 0 1 2 3 4 5 自定义进制符号 练习 现在有10进制数 10个符号分别是:2,9,1,7,6,5,4, 8,3 , A 逢10进1 那么: 123 + 234 = ____ 那么刚才通过10进制运算可以转化10进制然后查表 但是如果是其他进制.我们就不能转换,要直接学会查表 现在有9进制数 9个符号分别是:2,9,1,7,6,5,4, 8,3 逢9进1 那么: 123 + 234 = ____

    26620编辑于 2023-03-23
领券