2013-05-08 68 views
0

問題1:我有以下彙編代碼,其目的是循環通過一個輸入字符串,和計數的換碼字符「%」它遇到的數目:查找轉義字符

.globl sprinter 

.data 

.escape_string: .string "%" 

.num_escape: .long 0 

.num_characters: .long 0 

.text 

sprinter: 
    pushl %ebp 
    movl %esp,%ebp 

    movl 8(%ebp),%ecx # %ecx = parameter 1 

loop: 
    cmpb $0, (%ecx) # if end of string reached 
    jz exit 
    cmpl $.escape_string,(%ecx) # if escape character found 
    je increment 
    back: 
     incl .num_characters 
     incl %ecx 
     jmp loop 

increment: 
    incl .num_escape 
    jmp back # jump to 'back' 

exit: 
    movl .num_escape, %eax # return num_escape 

    popl %ebp 
    ret 

該組件代碼與下面的C代碼一起編譯:

#include <stdio.h> 
extern int sprinter (char* string); 
int main (void) 
{ 
    int n = sprinter("a %d string of some %s fashion!"); 
    printf("value: %d",n); 
    return 0; 
} 

從運行該代碼的期望的輸出是value: 2(因爲有字符串中2「%」字符),但它返回value: 0,意味着以下行失敗(因爲它從來沒有增加計數器):

cmpl $.escape_string,(%ecx) # if escape character found 

我使用的字符串比較的方法不對?外層循環工作正常,並且.num_characters正確地包含了我的字符串中的字符數。我產生了一個簡單的C程序相比,字符串「hello」到「hello2」一些彙編代碼,這是相關代碼:

.LC0: 
    .string "hello" 
.LC1: 
    .string "hello2" 

... 
movl $.LC0, -4(%ebp) 
cmpl $.LC1, -4(%ebp) 

它看起來非常相似,我試過了,不是嗎?

問題2。這段代碼是用匯編語言編寫的一個簡化的sprintf函數的一部分。這意味着第一個參數應該是結果字符串,第二個參數是格式。如何將一個字節從當前位置複製到另一個寄存器中的當前位置?假設我們指定了我們的參數分爲兩個寄存器:

movl 8(%ebp),%edx # %edx = result-string 
movl 12(%ebp),%ecx # %ecx = format-string 

我試圖在循環中的以下內容:

movb (%ecx), %al 
movb %al, (%edx) # copy current character to current position in result register 
incl %ecx 
incl %edx 

但結果字符串只包含(在我的字符串的第一個字符)a,而不是我所期望的那樣。

所有幫助讚賞,因爲這個比較問題(問題1)目前讓我卡住。

回答

2

關於問題1,看起來您正在比較單字節字符,所以'cmpl'在檢查轉義字符時應該是'cmpb'。你還需要將你的角色加載到一個寄存器中。我不是很熟悉AT & T組件,所以我希望這是正確的。

環之前:

movb .escape_string, %al 

比較:

cmpb %al, %(ecx) 
+0

這將返回:'/tmp/ccZauarM.o:在函數 '循環': (的.text + 0xd中):搬遷截斷爲fit:R_386_8對'.data' collect2:error:ld返回1退出狀態,這導致我相信該字符串實際上被存儲爲一個long,並且它截斷了字符串以適合字節比較,這是錯誤的錯誤解釋? – ponycat 2013-05-08 19:24:30

+0

我相信.escape_string指的是文字字符串的地址。你將需要將你的角色加載到一個字節寄存器中。 – TractorPulledPork 2013-05-08 19:37:13

+0

將它移入一個字節寄存器,然後比較運作良好!謝謝! – ponycat 2013-05-08 19:52:13