如何在 x86_64 中循环创建字符串

院长

我有一个字符串,我想将该字符串中的任何符号转换为另一个符号(例如,将“a”转换为“4”,将“e”转换为“3”等)。

逻辑:

i) 使用定义的字符串变量 db

ii) 定义resb用于将转换后的字符传输到的字符串变量

iii) 遍历第一个字符串并用于cmp根据需要转换字符

iv) while 循环将转换后的字符存储在第二个变量中

v) 打印第二个转换后的字符串

我目前的尝试:

section .data
    ; constants
    EXIT_SUCCESS    equ 0
    SYS_exit    equ 60
    SYS_read    equ 0
    SYS_write   equ 1

    ; variables
    sym     db "01010",10,"$"
    text0   db " "
    text1   db "$"
    text2   db "",10
    
section .bss
    ; reserve space for output symbol
    symbol  resb 6

section .text
    global _start

_start:
    mov rax, sym
    call _print

    mov rax, SYS_exit
    mov rdi, EXIT_SUCCESS
    syscall


_print:
    mov rbx, 0          ; use rbx to count len(string)

_printLoop:
    inc rax
    inc rbx
    mov cl, [rax]       ; will hold next char in string
    
    cmp cl, "0"         ; if 0 add space
    je _addT0

    cmp cl, "1"         ; if 1 add $ symbol
    je _addT1

    cmp cl, "$"         ; if end of string
    je _continuePrint

    mov symbol[rbx], text3      ; default: add new line 
    jmp _printLoop

_addT0:
    mov symbol[rbx], text0
    jmp _printLoop

_addT1:
    mov symbol[rbx], text1
    jmp _printLoop

_continuePrint:
    mov rax, 1
    mov rdi, 1
    mov rsi, symbol
    mov rdx, rbx            ; use rbx as count
    syscall

    ret

例如,如果sym"01010",我希望输出sym等于" $ $ "

维特软件

递增raxat_printLoop:使您始终省略输入字符串的第一个字符。在地址 fromeax被使用后,将增量推迟到以后

_printLoop:
    inc rbx
    mov cl, [rax]       ; will hold next char in string
    inc rax             ; Prepare EAX to point at the next character.
    ...

像指令mov symbol[rbx], text0是错误的,因为text0代表了地址text0,而不是它的内容
重新定义text0 db " "text0 equ " ",这将使它成为一个(立即数" "别名 0x20)而不是内存变量类似text1 equ "$", 和text2 equ 10正确的 NASM 语法是
mov byte [symbol+rbx], text2 ; default: add new line.

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在x86_64 asm中调用malloc

如何创建可启动的x86_64程序?

如何在 Ubuntu x86_64 上的 QEMU 中安装 arm64 iso?

如何在x86_64上的前4GB中“分配”

如何在Linux X86_64中测试Intel HyperThreading的性能

如何在C中修复“体系结构x86_64的未定义符号”?

如何在Linux中为x86_64实现epoll_wait

如何在x86_64系统的glibc编译过程中设置参数i486?

如何使用yum安装redhat / el6 / x86_64 /中列出的rpm

如何在NASM x86_64 Linux Assembly中将字符串中的一个字符与另一个字符进行比较

如何在程序集x86-64中保存字符串临时变量

32位系统调用表入口点如何映射到x86_64中的SYSCALL_DEFINE

如何使用C ++,CMake和Tensorflow修复“ ld:在体系结构x86_64中找不到的符号”?

在CentOS 5.9(x86_64)中安装Python 3.3.2时,如何解决_decimal模块编译错误?

如何在PHP字符串中创建while循环?

如何创建一个具有x个相同字符的字符串而不在AWK中循环?

如何清理格式错误的x86_64程序集?

如何让AMD Catalyst在Arch x86_64上运行

如何修复x86_64体系结构错误?

比较用户输入的字符 x86_64 程序集

x86_64 中还有 HIGHMEM 分配吗?

从x86_64 Linux中的内联asm进行Syscall?

nasm x86_64中的Strcmp,寄存器

在Slackware x86_64中安装Skype

NASM x86_64 删除换行符并在字符串末尾添加 0

反转字符串的代码:“架构 x86_64 的未定义符号”

x86_64程序集字符串操作导致分段错误

使用x86或x86_64程序集反转字符串的最简洁方法是什么?

如何在 cocos2d-x 3.17v 中创建字符串数组