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