正如你所想的那樣,我對這件事很陌生(包括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下。
你應該讓這樣的功能,其宏展開內部狀態各地你的代碼是不好的風格(甚至彙編!)。它也將有助於您的調試。如果你需要更多的幫助來解決你的問題,你應該發佈gdb('gdb。/ your-program')的所有相關代碼和輸出,並捕獲'bt'和'info reg'的輸出。 – user786653