Assembly 关于搜索子串的NASM汇编问题

Assembly 关于搜索子串的NASM汇编问题,assembly,x86-64,nasm,Assembly,X86 64,Nasm,嗨,伙计们,我正试图写这段代码来检查输入的字符串中是否有字符。这是我的密码 我写了打印语句来查看我的程序是如何运行的,但它完全不打印任何内容 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 "n

嗨,伙计们,我正试图写这段代码来检查输入的字符串中是否有字符。这是我的密码

我写了打印语句来查看我的程序是如何运行的,但它完全不打印任何内容


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  
我已经写了**所有这些代码**,它没有打印出来。有人能告诉我我做错了什么吗?如果你想让我重新措辞这个问题,请告诉我

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

mov rdx, string1
这是一个您在程序中重复多次的错误


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


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

如果要使用RIP相对地址,
leardx,[string1]
leardx,[string1]
需要
default rel
才能理解,否则使用
mov-edx,string1
leardx,[rel-string1]
,但您应该对
string1
fmt
做同样的事情。
mov rdx, string1