2013-10-03 177 views
0

我有一個包含一個緩衝區:「B」「A」「C」「\ n」和我想換字母「B」和「A」 ......x86彙編,交換語法

檢查調試器,印刷的4個字節的EBP: 'b' 'A' 'C' '\ N' ....

  1. EBP - 緩衝區
  2. EAX的地址 - 偏移量(當前爲0 ),以便Ebp + eax指向緩衝區中的'b'
  3. Ebx - 包含'b'
  4. Edi - 包含'a'

問題是,當我運行應該覆蓋在緩衝區中的「B」與「一」的命令:

mov [ebp + eax] , edi  

...我打印緩衝區,它現在包含: 'a''c''\ n'...'b'去了哪裏?如果我跑這應該覆蓋的「a」中的Buff與「B」的下一個命令,完成交換:

mov [ebp + eax + 1], ebx 

...我打印緩衝區,它現在包含:「A」' b''a''c'...而不是'a''b''c''\ n'...任何人都可以解釋這裏發生了什麼嗎?

+4

您只需要移動一個字節,而不是整個寄存器(4個字節)。 –

回答

1

我認爲你收到

mov ebx, [ebp + eax]  ; ebx = 'bac\n', because you've just copy 4 bytes from ebp + eax to ebp + eax + 3 
mov edi, [ebp + eax + 1] ; edi = 'ac\n\garbage', which is ebp + eax + 1 to ebp + eax + 4 

因此複製整個32位寄存器的舉動再次

mov [ebp + eax], edi  ; the string now becomes 'ac\n\garbage' 
mov [ebp + eax + 1], ebx ;      'abac' 

這就是你看到後。你應該只複製一個字節,而不是一個雙字。但是SI沒有相應字節的寄存器名,所以你應該重新安排您註冊使用一個共同的字節寄存器,如CL,BL

如果你使用x86_64的則只是複製和SIL和BL

1

OP的關鍵問題是EDI只能作爲32位值移動到內存中。他需要一個可以按照8位值移動的寄存器,正如Luu所建議的;這將是AH,AL,BH,...。 AL最容易使用,它是EAX的「一部分」。

如果OP會修改他的代碼以便EDI包含偏移量,並且EAX包含該字符,那麼遵循Luu的建議將很容易。然後以存儲一個字節所需要的指令是

mov byte ptr [ebp+edi],al 

的「字節的ptr」告訴你期望移動8,而不是32位彙編器;這在技術上是不必要的,因爲使用AL清楚地表明只使用8位,但對讀者有幫助。