nasm 简单程序中的段错误
nasm segfault in simple programm
此代码应该以 1 位输出密钥长度,但它输出段错误。
我不明白我做错了什么,问题一定在清单的第一部分,因为我直接从书本上取了 flen
函数:
section .text
global _start ;must be declared for linker (ld)
_start:
mov edi,key
call flen
mov ebx,1
add ecx,38
mov edx,1
int 0x80
flen: ;length of string on es:edi
xor eax,eax
xor ecx,ecx
dec ecx
cld
repne scasb
neg ecx
ret
xor eax,eax
inc eax
int 0x80
section .data
key db '123456',0x0
keylen equ $ - key ;length of our dear string
plaintext times 256 db 1
您应该将退出代码移到 flen
之前。因为它是你的控制流在系统调用 returns 之后再次进入 flen
。您还应该将系统调用号放入 eax
。此外,要打印的值必须在内存中,并且必须传递一个指针。 0
的 ascii 码是 48
而不是 38
,或者你可以直接使用 '0'
。像这样:
section .text
global _start ;must be declared for linker (ld)
_start:
mov edi,key
call flen
add ecx, '0' ; convert to ascii
push ecx ; put text onto stack
mov ecx, esp ; put address into ecx
mov eax, 4 ; sys_write
mov ebx,1
mov edx,1
int 0x80
xor eax,eax
inc eax
int 0x80
flen: ;length of string on es:edi
xor eax,eax
xor ecx,ecx
dec ecx
cld
repne scasb
neg ecx
ret
section .data
key db '123456',0x0
keylen equ $ - key ;length of our dear string
plaintext times 256 db 1
注意 flen returns 8
。
PS: 学习使用调试器。
此代码应该以 1 位输出密钥长度,但它输出段错误。
我不明白我做错了什么,问题一定在清单的第一部分,因为我直接从书本上取了 flen
函数:
section .text
global _start ;must be declared for linker (ld)
_start:
mov edi,key
call flen
mov ebx,1
add ecx,38
mov edx,1
int 0x80
flen: ;length of string on es:edi
xor eax,eax
xor ecx,ecx
dec ecx
cld
repne scasb
neg ecx
ret
xor eax,eax
inc eax
int 0x80
section .data
key db '123456',0x0
keylen equ $ - key ;length of our dear string
plaintext times 256 db 1
您应该将退出代码移到 flen
之前。因为它是你的控制流在系统调用 returns 之后再次进入 flen
。您还应该将系统调用号放入 eax
。此外,要打印的值必须在内存中,并且必须传递一个指针。 0
的 ascii 码是 48
而不是 38
,或者你可以直接使用 '0'
。像这样:
section .text
global _start ;must be declared for linker (ld)
_start:
mov edi,key
call flen
add ecx, '0' ; convert to ascii
push ecx ; put text onto stack
mov ecx, esp ; put address into ecx
mov eax, 4 ; sys_write
mov ebx,1
mov edx,1
int 0x80
xor eax,eax
inc eax
int 0x80
flen: ;length of string on es:edi
xor eax,eax
xor ecx,ecx
dec ecx
cld
repne scasb
neg ecx
ret
section .data
key db '123456',0x0
keylen equ $ - key ;length of our dear string
plaintext times 256 db 1
注意 flen returns 8
。
PS: 学习使用调试器。