Linux 汇编-将值转换为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

我在这里找到了一些关于将值转换为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
                        ;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
    为零。因此,在您
    div ebx
    之前,xor edx,edx
  • 您应该在缓冲区的前端填充空格,否则可能会遇到麻烦,具体取决于stdout最后的位置
  • 我非常怀疑您使用
    ebp
    将指针保持在当前缓冲区位置。虽然它在这里工作,但基指针是一个特殊用途的寄存器,我认为没有理由在这里滥用它

您是否必须在不使用C标准库的情况下执行此操作?如果没有,使用带有格式说明符的
printf
将比使用fd1的
sys\u write
容易得多。只是中断和系统调用。;)另外,打印零字节也不好,但它可能恰好适用于终端。@Jester说得好,谢谢!我添加了这一点和另一点。是的,忘记了一些基本的东西:on.printPID我忘了执行中断0x80.:)谢谢:P