2011-08-04 75 views
1

正如你所想的那樣,我對這件事很陌生(包括nasm和assembly,儘管我之前做過一些基本的彙編)。
我想創建一個打印整數到標準輸出的函數。使用不可重用的代碼(其中要打印的數字是靜態的),我已經成功......但是,由於顯而易見的原因,我希望它將該數字打印爲參數。在nasm宏中創建緩衝區?

我不確定一個宏還是一個函數對我來說是最好的,我根本找不到關於NASM宏的主題。我已經仔細閱讀了手冊,但這還不夠。

無論如何,我試圖用NASM宏來做這件事,因爲我創建了另一個以這種方式打印成功的字符串。
我已經縮小問題代碼這樣:

%macro crash 1 
jmp %%endstr 
%%str: db %1,0x0a 
%%endstr: 
mov [%%str], byte 0x16 <<< this crashes (segmentation fault) 
%endmacro 

section .text 
global _start 
_start: 
crash "abc" 

它看起來像在緩衝崩潰使用括號任何東西,我只能假設我這樣做是錯誤的。
我想要上面要做的是用另一個字節值覆蓋%% str中的第一個字節。更確切地說,我需要將字符串逐字節地向後寫入緩衝區;我(嘗試)這樣做有一個循環,我在那裏做

mov [%%str+rcx], dl 
dec rcx 

直到RCX爲0

如果我不應該使用宏對於這一點,請賜教!
我打算將該功能保存在一個小型庫中供以後使用,因此應該很容易將它彈出到任何NASM項目中。

正如主題和標籤所說,所有這些都在Linux/amd64下。

+0

你應該讓這樣的功能,其宏展開內部狀態各地你的代碼是不好的風格(甚至彙編!)。它也將有助於您的調試。如果你需要更多的幫助來解決你的問題,你應該發佈gdb('gdb。/ your-program')的所有相關代碼和輸出,並捕獲'bt'和'info reg'的輸出。 – user786653

回答

4

你不能在代碼段中這樣做,因爲它是隻讀的。你應該在@data段聲明str,那麼你會沒事的。而且,就像@ user786653所說的那樣,「你應該讓這個函數成爲一個函數,讓宏在你的代碼中傳播內部狀態是糟糕的風格(即使是彙編器!)」。

+0

該死的,我是如何忽略數據代碼段的隱式使用?在老的彙編程序代碼中查看太多無關緊要的事情我會猜測:) +1由於這幾乎肯定是正確的答案。 – user786653

+0

謝謝,現在你說我記得。我應該再次通過基礎知識。無論如何,這有點令人困惑:[this code](https://gist.github.com/a0b75f5a28a2d079ffb7)以相同的方式存儲數據!我認爲這只是一種僥倖,而不是我應該考慮使用代碼的東西,然後呢? – exscape

+2

@exscape:該代碼不寫入字符串。您可以在代碼段中擁有隻讀數據,但您不能(不應該)在那裏寫入數據。 – user786653

0

for in section .data

;在部分使用字節

%macro BUFFER 2 
%1: 
    .start: times %2 db 0 
    .end: 
    .length: equ %1.end-%1.start 
%endmacro 

的姓名和電話號碼爲的.bss

;使用名稱和字節數這裏

%macro BUFFER 2 
%1: 
    .start: resb %2 
    .end: 
    .length: equ %1.end-%1.start 
%endmacro 

問題是我們想知道緩衝區的最後一個字節則是buffer.end- 一個可能的解決方案,但我沒有嘗試它尚未:

%macro BUFFER 2 
%1: 
    .start: times %2-1 db 0 
    .end: db 0 
    .length: equ %1.end-%1.start 
%endmacro 

同上的.bss段

%macro BUFFER 2 
%1: 
    .start: resb %2-1 
    .end: resb 1 
    .length: equ %1.end-%1.start 
%endmacro 
相關問題