Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >汇编at&t

汇编at&t

作者头像
平凡的学生族
发布于 2021-03-03 03:19:26
发布于 2021-03-03 03:19:26
64800
代码可运行
举报
文章被收录于专栏:后端技术后端技术
运行总次数:0
代码可运行

比较得到数组最大数

写一个比较得到最大数的汇编, 注意:

  • long是4字节
  • movl, mov运用在不同范围的数字, mov会搬运64位数字(超过了long的长度), movl会搬运32位(刚好是long的长度)
  • rdx, edx是同一寄存器上的不同范围, rdx是64位, edx是32位
  • 立即数寻址要加$

真是耗费了我好些经历, 写了一整天, 每次都报错segment fault(其实是因为对数的范围和寻址不敏感, 导致访问了非法内存). 为此还学习了一番gdb调试, 真不戳!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.section .data
data_items:
  .long 3, 74, 34, 222, 34, 75, 54, 34, 44, 33, 22, 11, 66
len = . - data_items

.section .text
.globl _start
_start:
  mov $-4, %rdi
  movl data_items(,1), %ebx
start_loop:
  add $4, %rdi
  # 比较是否到最后一个元素
  cmp $len, %rdi
  jae exit_loop
  # 取元素比较大小
  movl data_items(, %rdi), %eax
  cmp %rax, %rbx
  jle assign_max
  jmp start_loop
assign_max:
  mov %rax, %rbx
  jmp start_loop
exit_loop:
  mov $1, %rax
  int $0x80
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rasak@515jzl:~/Programs$ as -o demo.o demo.s
rasak@515jzl:~/Programs$ ld -d demo.o -o demo
rasak@515jzl:~/Programs$ ./demo
rasak@515jzl:~/Programs$ echo $?
222

各类寄存器用途

耶鲁x86汇编教程, 很不错的教程, 很清晰.

文中提到, 大部分寄存器都没有特殊用途, 除了rbprsp是用作栈的(64位系统). rip指向当前执行的指令.

我们以一个简单例子说明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.section .text
.globl _start
_start:
  push $3
  push $5
  pop %rax
  pop %rbx

gdb调试一下, 先运行两次nexti, 也就是执行两次push, 然后查看寄存器情况: rip指向当前的指令, rsp指向的位置保存了5. rbp为0(为什么呢?)

gdb调试

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
汇编学习(3),ddd以及跳转循环
可以发现ddd 就是带有GUI的gdb,先在main上打个断点,点击run,这时候就会停到main上。
一只小虾米
2022/12/02
4170
汇编学习(3),ddd以及跳转循环
go语言调度器源代码情景分析之二:CPU寄存器
寄存器是CPU内部的存储单元,用于存放从内存读取而来的数据(包括指令)和CPU运算的中间结果,之所以要使用寄存器来临时存放数据而不是直接操作内存,一是因为CPU的工作原理决定了有些操作运算只能在CPU内部进行,二是因为CPU读写寄存器的速度比读写内存的速度快得多。
阿波张
2019/06/24
1.2K0
【CSAPP】BombLab
《CSAPP》是指计算机系统基础课程的经典教材《Computer Systems: A Programmer's Perspective》,由Randal E. Bryant和David R. O'Hallaron编写。该书的主要目标是帮助深入理解计算机系统的工作原理,包括硬件和软件的相互关系,其涵盖了计算机体系结构、汇编语言、操作系统、计算机网络等主题,旨在培养学生系统级编程和分析的能力。
SarPro
2024/02/20
2190
【CSAPP】BombLab
x86_64汇编调试程序初步
掌握此基础,就可以用来修改无源代码的程序等,比如希望jstatd在指定的端口上监听,而不是一个值为0的随机端口号,请参见《防火墙内JVisualVM连接jstatd解决方案》。
一见
2018/12/24
7460
bthread源码剖析(三): 汇编语言实现的上下文切换
上回书说道,TaskGroup的run_main_task()有三大关键函数,剩余一个sched_to()没有展开详谈。那在今天的sched_to()源码探秘之旅开始之前呢,首先高能预警,本文会涉及到汇编语言,所以请大家坐稳扶好!
果冻虾仁
2021/12/08
9890
go语言调度器源代码情景分析之五:汇编指令
汇编语言是每位后端程序员都应该掌握的一门语言,因为学会了汇编语言,不管是对我们调试程序还是研究与理解计算机底层的一些运行原理都具有非常重要的作用,所以建议有兴趣的读者可以多花点时间把它学好。
阿波张
2019/06/24
1.1K0
go语言调度器源代码情景分析之五:汇编指令
​CS:APP Attack Lab: 缓冲区溢出攻击
CMU的15-213课程Introduction to Computer Systems (ICS)里面有一个实验叫attack lab,利用缓冲区溢出漏洞改变正常的程序运行行为,从而达到攻击的目的。关于这个lab的解题思路,网上已经有很多了,但我依然想要再来一篇。原因包括:
王录华
2020/02/25
2.7K0
Linux下Shellcode编写
基本过程是首先使用汇编通过系统调用的方式实现程序功能,编译成可执行文件,然后使用 objdump 进行机器码提取
yichen
2022/01/06
2.3K0
汇编学习(2),数据表示与寄存器
本篇介绍下数据在计算机中的表示形式以及常用的寄存器, 最后再学一个稍微复杂点的代码。
一只小虾米
2022/12/02
4720
汇编学习(2),数据表示与寄存器
x64架构下Linux系统函数调用
push指令将数据压栈。具体就是将esp(stack pointer)寄存器减去压栈数据的大小,再将数据存储到esp寄存器所指向的地址。
Orlion
2024/09/02
1560
x64架构下Linux系统函数调用
腾讯极客挑战赛丨从“碰撞”到“爆破”,42次尝试终破纪录
各位爱挑战爱学习的coder们,大家千呼万唤的解题思路来啦!(原赛题传送门:腾讯极客挑战赛丨全世界最最最小的程序,等你来battle!)
腾讯极客挑战赛
2021/06/16
1.1K0
腾讯极客挑战赛丨从“碰撞”到“爆破”,42次尝试终破纪录
程序的机器级表示
call proc后, 这个过程会push main的调用地址的下一处,在proc里面也会push rbp, 通过打印内存的值,可以看到 rsp上 存储的变量信息, 选用的数字比较有规则,比如 0x12345678 , 0x 66666666 如下图:
changan
2020/11/04
3240
程序的机器级表示
golang源码分析:go 汇编
AT&T格式的汇编代码中所有寄存器名字前面都有一个%符号,rsp代码sp寄存器,里面存的是栈顶指针。
golangLeetcode
2022/08/02
9370
golang源码分析:go 汇编
汇编学习(12), SIMD之AVX(已完结)
AVX(Advanced Vector Extensions)用的是ymm寄存器,每个256字节。 先看一个数据操运算的例子:
一只小虾米
2022/12/28
5420
动态调试elf文件的几种方法
最近在刷题的时候遇到了很多elf文件,虽然可以通过ida分析伪代码解出来,但是发现有些通过动态调试的方式可以直接找到flag,这样简单了不少,因为之前接触的linux下的逆向题目比较少,所以通过这次刷题也记录一下动态调试elf文件的几种方式。
鸿鹄实验室
2022/05/27
3.9K0
动态调试elf文件的几种方法
【参赛经验分享】实现一个世界上最小的程序来输出自身的MD5 388解法分享
这题整体思路其实大家应该都很明白了。这里主要是列举一些优化点。elf header相关的做的比较挫,求其他大神思路。
王沛文
2021/08/30
6440
《深入理解计算机系统》(CSAPP)实验二 —— Bomb Lab
  本次实验中的bomb文件中共有7个炸弹问题(6个显式的和1个隐藏的),每条问题只有输入正确的答案才能进入下一题,否则则会触发爆炸。通过阅读bomb文件的汇编代码理解各个问题的运作方式,推出正确的输入答案。隐藏的问题需要通过gdb直接调用解决。
嵌入式与Linux那些事
2021/05/20
2.1K0
《深入理解计算机系统》(CSAPP)实验二 —— Bomb Lab
汇编学习(4), 整数,栈,浮点
可以用于有符号,也可以用于无符号,第二个操作数会加到第一个操作数上。对于有符号数,如果第一个操作数放不下结果,那么CF 标记会置位,对于无符号数,OF标记会置位,如果结果是0,ZF标记会置位,如果结果是负数,那么SF标记会置位。 sub 和add类似,无需重复。
一只小虾米
2022/12/07
3190
汇编学习(6), 外部函数,调用约定
在前面已经多次见过使用printf了,这次我们也可以自己写一些外部函数,下面是一个例子: 首先定义2个外部函数,分别是c_area和c_circum。
一只小虾米
2022/12/11
6730
汇编学习(6), 外部函数,调用约定
从一道 CTF 题看 SROP | PWN
SROP 学习过程中,很大一部分人写的 smallest 这道题的 writeup 让我感觉很疑惑,为了证明他们写的存在一定问题,被迫走上了 pwntools + gdb 调试的路,所以这次只能用视频来进行展示了,文章剩余部分是讲义的内容 也不知道因为啥,磨磨唧唧唠了近两个小时,在视频中,大家可以 get 以下内容: SROP 原理及利用 一道 CTF 题的解题方法 pwntools + gdb 如何进行调试 SROP 整个过程中栈的内容是如何变化的 一些偏执... 视频已经上传到 B 站了 https:/
意大利的猫
2022/03/29
1K0
相关推荐
汇编学习(3),ddd以及跳转循环
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文