【问题标题】:NASM Assembly Question regarding to searching for a substring关于搜索子字符串的 NASM 组装问题
【发布时间】:2020-10-26 03:46:01
【问题描述】:

大家好,我正在尝试编写这段代码来检查字符是否在输入的字符串中。这是我的代码

我已经编写了打印语句来查看我的程序是如何运行的,但它完全没有打印任何内容。


extern getchar
extern printf
extern strlen
extern strchr


SECTION .data

    string1: db 0,0,0,0,0,0,0,0,0,0,0,0
  string2: db "it is there",10,0
  string3: db "not there",10,0
  string4: db "welp",10,0
  char:    db  "t",10,0
    count: dq 12
    forcount: dq 12 
  
    fmt: db "%s", 10, 0
  ;fmt2: db "%s", 10, 0

SECTION .text
global main
main:
SECTION .text
global main
main:
    sub     rsp, 32             ; shadow space

    mov     rdi, string1        ; printing to
    cld                         ; clear direction flag

.while:
    cmp     qword [count], 0    ; only get a char while counter is > 0
    jne     .continue
    jmp     .done
.continue:
    mov     rax, 0              ; clear rax before we get a char
    call    getchar
    cmp     eax, 10             ; newline
    jne     .continue2          ; stop collecting on new lines
    jmp     .done
.continue2:
    stosb                       ; puts al into [rdi] and then increments rdi
    sub     qword [count], 1
    jmp     .while
.done:
    mov     byte [rdi+1], 0     ; don't forget to 0 terminate your strings
    ;lea        rdx, [string1]                                                             ;it is here so fa
    ;lea        rcx, [fmt]
    ;call   printf
    

    
      lea rsi, [string1]
    lea rcx, [string1]
    call strlen
    
    lea rcx, [rax - 1] ; we need to decrement rax by 1 since strings are 0 indexed
    add rsi, rcx ; index to end of string (- 1)
    std ; auto decrement rsi
      mov   rdx, [string1]
   lea   rcx, [fmt]            ; a fmt string containing %lld
   call  printf  


;using it
mov    rcx, string1
mov    rdx,[char]
call     strchr

sub    rax, rcx 

cmp   rax, 0x00
je       .no    
jne     .yes 
jmp   .welp
 

 
.yes:
    mov   rdx, [string2]
   lea   rcx, [fmt]            ; a fmt string containing %lld
   call  printf    
.no:
 mov   rdx, [string3]
   lea   rcx, [fmt]            ; a fmt string containing %lld
   call  printf  

.welp:
 mov   rdx, [string4]
   lea   rcx, [fmt]            ; a fmt string containing %lld
   call  printf  

我已经写了**所有这些代码**并且它没有打印出来。有人可以告诉我我在这里做错了什么吗?如果你想让我改写问题,请告诉我

【问题讨论】:

    标签: assembly x86-64 nasm


    【解决方案1】:
    std                   ; auto decrement rsi
    mov   rdx, [string1]
    lea   rcx, [fmt]      ; a fmt string containing %lld
    call  printf
    

    鉴于您正在为 NASM 编码,加载 string1 的地址需要变为:

    mov rdx, string1
    

    这是您在程序中重复多次的错误!!!


    还要注意,调用任何设置了方向标志的库函数绝不是一个好主意。许多codez希望方向标志清晰。
    此外,您当前的程序无论如何都不会使用该设置方向标志。


    您的程序出口在哪里?
    为什么有 2 个SECTION .text 声明?
    ...

    【讨论】:

    • 或者lea rdx, [string1],如果要使用相对于 RIP 的地址。
    • lea rdx, [string1] 需要default rel 才有意义,否则请使用mov edx, string1lea rdx, [rel string1],但是是的,您应该对string1 执行与fmt 相同的操作。
    猜你喜欢
    • 2015-10-06
    • 2021-10-23
    • 1970-01-01
    • 2015-02-05
    • 2013-04-08
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多