• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2023-08-08 23:47 Aet 隐藏边栏 |   抢沙发  2 
文章评分 2 次,平均分 5.0

字符串

反转字符串

  1. 4个常量

解析

  1. _start开始
    1. INPUT地址放入rsi寄存器
    2. 通过异或将rcx清零
    3. cld清除方向标志位,让后续字符串操作从低地址向高地址进行。

  1. 保存返回地址,当exitFromRoutine结束后,正确返回

  1. calculateStrLen
    1. 先判断rsi寄存器是不是指向0,如果是,意味着到了字符串的尾部了,退出函数
  2. (设置cld后),lodsb每次都会将rsi从左到右移动一个字节
  3. 然后把rax值压入栈
  4. 同样的道理,把字符串的其他符号都压入栈

  1. 循环节后,字符串所有字符都被压入栈中
  2. 开始执行exitFromRoutine,返回到calculateStrLen下一句
  3. 然后把raxrdi清零,开始条用reverseStr

  1. 循环,检查计数器,即字符串的长度,如果它为零,我们将所有符号写入缓冲区并可以打印它
  2. 检查计数器后,将第一个符号从堆栈弹出到 rax 寄存器,并将其写入 OUTPUT 缓冲区
  3. 输出,换行,退出

字符串操作

  1. rep:当rcx不为零时重复
  2. movsb:复制字节字符串
  3. cmpsb:字节串比较
  4. scasb:字节串扫描
  5. stosb:将字节写入字符串

问题

  1. 这个程序跑起来似乎有问题,后续观察下:todo

cld

  1. 在x86架构的汇编语言中,CLD指令用于清除方向标志(Direction Flag, DF
  2. 方向标志是在标志寄存器(Flags Register)中的一个位,它影响某些字符串操作的处理方向
    1. 当方向标志被设置时(通过使用STD指令),一些字符串操作,如MOVS(移动字符串)、LODS(加载字符串)、STOS(存储字符串)、SCAS(扫描字符串)等,将从高地址向低地址操作。这意味着它们将从内存的末尾开始,并向内存的开始方向移动。
    2. 当方向标志被清除时(通过使用CLD指令),这些操作将从低地址向高地址进行,从内存的开始位置并向内存的末尾方向移动

$

  1. 返回$定义的字符串在内存中的位置

$$

  1. 返回当前section在内存中开始的位置

  1. 宏中定义的所有标签必须以%%开头

单行

多行

示例

  1. print
  2. __syscall_write 带有2个参数

  1. 使用这个宏

标准宏

  1. 定义数据结构

  1. 示例

%include

  1. 可以包含其他汇编文件并跳转到那里的标签或使用 %include 指令调用函数

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0 最后编辑于:2023-08-09
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享