0

我在这里找到了一些关于将值转换为 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) 并返回 pidnumber。但是,sys_write 参数是:ssize_t sys_write(unsigned int fd, const char * buf, size_t count) 第二个参数是一个字符,所以我需要为每个数字转换成字符。

输出仅为:“您的 PID 是:”

任何人 ?:)

4

1 回答 1

2
  • 您忘记int 0x80了第二次实际打印该号码。
  • 当您 时div ebx,计算的是eax = edx:eax / ebx,因此您必须确保edx在您的情况下为零。所以xor edx,edx在你之前div ebx
  • 您应该用空格填充缓冲区的前面,否则您可能会遇到麻烦,具体取决于 stdout 的最终位置。
  • 我非常怀疑您使用ebp来保持指向当前缓冲区位置的指针。虽然它在这里工作,但基指针是一个特殊用途的寄存器,我认为没有理由在这里滥用它。
于 2013-10-12T20:23:28.070 回答