【问题标题】:Assembly - Convert value to ascii汇编 - 将值转换为 ascii
【发布时间】:2013-10-12 18:39:23
【问题描述】:

我在这里找到了一些关于将值转换为 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 为:”

有人吗? :)

【问题讨论】:

  • 您必须在不使用 C 标准库的情况下这样做吗?如果没有,使用带有格式说明符的printf 会比带有fd 1 的sys_write 容易得多。
  • 我不想使用 C lib。只是中断和系统调用。 ;)

标签: linux assembly x86 ascii system-calls


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

【讨论】:

  • 另外,打印零字节并不好,但它可能恰好适用于终端。
  • @Jester 好点,谢谢!我添加了这一点和另一点。
  • 是的,忘记了一些基本的东西:在 .printPID 上我忘了做中断 0x80。 :) 谢谢 :P
猜你喜欢
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
  • 2014-05-06
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
相关资源
最近更新 更多