Linux 汇编-将值转换为ascii
我在这里找到了一些关于将值转换为ascii的主题。但我有点被困在这里了。 这是我的密码:Linux 汇编-将值转换为ascii,linux,assembly,x86,ascii,system-calls,Linux,Assembly,X86,Ascii,System Calls,我在这里找到了一些关于将值转换为ascii的主题。但我有点被困在这里了。 这是我的密码: ;GetPID SECTION .data msg: db "Your PID is:" ;pidmsg msgl: equ $-msg ;pidlen lookup: db "0123456789" SECTION .bss pid: resb 8 ;test is a variable im testing to
;GetPID
SECTION .data
msg: db "Your PID is:" ;pidmsg
msgl: equ $-msg ;pidlen
lookup: db "0123456789"
SECTION .bss
pid: resb 8 ;test is a variable im testing to
;receive the eax from sys_getpid
SECTION .text
global _start
_start:
call getpid ;get pid number into eax
mov ebx,0xa
lea ebp, [pid+6]
call ASCIIC
jmp exit ;exit
exit:
mov eax,1
mov ebx,0
int 0x80
getpid:
mov eax,20 ;getpid function (sys_getpid)
int 0x80
ret
;ASCIIC was taken from http://theropfather.github.io/asm/getpid_tutorial.html
ASCIIC:
div ebx ;Divide the PID
mov byte cl, [lookup+edx] ;Copy ASCII value to CL
mov [ebp], cl ;Copy ASCII value to buffer
dec ebp ;Next byte into buffer
xor edx, edx ;Clear the remainder
inc eax ;Dec eax tricking jnz
dec eax ;Push back to original value
jnz ASCIIC ;Keep looping until eax is zero
call .printPID ;Print out the buffer
ret
.printPID:
mov ecx, msg ;message
mov edx, msgl ;msg len
mov ebx,0x1 ;FD stdout
mov eax, 0x4 ;sys_write call
int 0x80 ;Call
mov [pid+7], byte 0xA ;Push a newline to PID string
mov edx,0x8 ;Max length of 8 bytes
mov ecx,pid ;Push PID value
mov ebx,0x1 ;FD stdout
mov eax, 0x4 ;sys_write call
ret
所以这里的要点是获取当前程序(this)的pid编号并打印它。
程序调用sys_getpid(eax=20)并返回PID编号。但是,sys_write参数是:ssize_t sys_write(unsigned int fd,const char*buf,size_t count)
第二个参数是字符,所以我需要将每个数字转换为字符
输出仅为:“您的PID为:”
有人吗?:) - 您第二次忘记了
来实际打印数字int 0x80
- 当您
时,计算的是div ebx
,因此您必须确保在您的情况下eax=edx:eax/ebx
为零。因此,在您edx
之前,xor edx,edxdiv ebx
- 您应该在缓冲区的前端填充空格,否则可能会遇到麻烦,具体取决于stdout最后的位置
- 我非常怀疑您使用
将指针保持在当前缓冲区位置。虽然它在这里工作,但基指针是一个特殊用途的寄存器,我认为没有理由在这里滥用它ebp
printf
将比使用fd1的sys\u write
容易得多。只是中断和系统调用。;)另外,打印零字节也不好,但它可能恰好适用于终端。@Jester说得好,谢谢!我添加了这一点和另一点。是的,忘记了一些基本的东西:on.printPID我忘了执行中断0x80.:)谢谢:P