2014-03-02 57 views
0

我仍然在學習如何使用NASM,因此在我的問題中可能會出現一些語法錯誤。無論如何,當我創建一個標籤,假設如何在NASM彙編器中打印以下內容?

buf: resb 16 

然後,標籤buf包含指向第一個被保留了16個字節的內存地址。然後,我想從這些16到最後一個任意字節打印的一切,比如,通過16打印字節13然後代碼會看起來像

mov eax, 4 
mov ebx, 1 
mov ecx, buf + 12 
mov edx, 4   ;; for the 4 bytes to be read 
int 80h 

這是正確的嗎?那麼,什麼我其實想做的是

some_number:  resb 1 

mov [some_number], byte 3 

mov eax, 4 
mov ebx, 1 
mov ecx, buf + 16 - [some_number] 
mov edx, byte [some_number]   ;; for the 3 bytes to be read, in this case 
int 80h 

,所以我想通過地址BUF +(16 - 3),這是BUF + 13.但是,這肯定是行不通的。讓我知道這是錯誤的還是有更好的方法來實現這一點。

順便說一句,some_number將由一個任意進程確定,所以它會在每次我的程序運行時不同。

+0

展示你是如何打印?沒辦法知道這些寄存器否則是正確的。 – TypeIA

+0

對不起,我忘記了包含系統中斷。我想寫入標準輸出。 –

回答

3

mov ecx, buf + 12是無效的,但你可以通過使用lea ecx, [buf + 12]這是相當多的「BUF的加載有效地址+ 12」實現這一目標,這就是你想要的。

儘管有效地址格式確實允許寄存器,但它不允許間接或減法,所以lea ecx, [buf + 16 - [some_number]]將雙重無效。您必須在單獨的步驟中進行減法,注意使用適當的操作數大小。一種選擇是:

lea ecx, [buf + 16] 
movzx eax, byte [some_number] 
sub ecx, eax 

如果您some_number是一個DWORD不是一個字節,你可以簡化到:

lea ecx, [buf + 16] 
sub ecx, [some_number]