2013-10-12 71 views
0

我在這裏找到了一些關於將值轉換爲ascii的主題。但我有點卡在這裏。 這裏是我的代碼:彙編 - 將值轉換爲ASCII

;GetPID 

SECTION .data 

msg: db "Your PID is:"  ;pidmsg 
msgl: equ $-msg   ;pidlen 

lookup: db "" 

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 

所以這裏的關鍵是獲取當前程序(本)中的PID號,並打印出來。 該程序調用sys_getpid(eax = 20)並返回pidnumber。但是,sys_write參數是:ssize_t sys_write(unsigned int fd, const char * buf, size_t count) 第二個參數是一個字符,所以我需要將每個數字轉換爲char。

輸出只是:「您的PID是:」

任何人? :)

+1

如果不使用C標準庫,你必須這樣做嗎?如果沒有,使用帶格式說明符的'printf'會比使用fd 1的'sys_write'更容易。 – us2012

+0

我不想使用C lib。只是中斷和系統調用。 ;) – int3

回答

2
  • 您忘記int 0x80第二次實際打印號碼。
  • 當你div ebx,什麼是計算是eax = edx:eax/ebx,所以你必須確保edx爲零你的情況。所以xor edx,edx之前你div ebx
  • 你應該在緩衝區的前面加上空格,否則你可能會遇到麻煩,這取決於stdout到底在哪裏。
  • 我非常懷疑你使用ebp來保存指針到當前緩衝區的位置。雖然它在這裏起作用,但基址指針是一個特殊用途的寄存器,我沒有理由在這裏濫用它。
+1

此外,打印零字節並不好,但它可能會發生在終端上。 – Jester

+0

@Jester好點,謝謝!我添加了這個和另一點。 – us2012

+0

是的,忘記了一些基本的東西:on.printPID我忘了做中斷0x80。 :)謝謝:P – int3