2013-03-19 14 views
0

我正在研究一個能夠在數組中找到最大元素的程序。出於某種原因,當我嘗試將矩陣的第一個元素移至ecx寄存器以輸出時(僅對其進行測試),我遇到了分段錯誤。在簡單的NASM操作中獲取分段錯誤;將矩陣指針移動到ecx寄存器中

我已經嘗試了所有不同類型的尋址模式,但我無法弄清楚爲什麼我得到這個錯誤,沒有任何工作。

這裏是我的代碼:

segment .data 

    NUM_ROWS: equ 5 
    NUM_COLUMNS: equ 5 
    NUM_ROW_BYTES: equ 10 

    ;Default matrix 
    matrix: dd 5, 4, 9, 7, 2, 1, 4, 6, 8, 7 
      ;9, 9, 2, 3, 7 
      ;6, 5, 8, 3, 4 
      ;1, 2, 8, 2, 6 
    matrixLen: equ $-matrix 

    sum: db "The sum of the last column is: ", 10 

    ;FOR TESTING 
    works: db 'Works!', 10 
    worksLen: equ $-works 

segment .bss 
    counter resb 1 

segment .text 
    global main 

main: 
    mov eax, 4  ; system call 4 
    mov ebx, 1  ; standard output 
    mov ecx, [matrix + 4] 
    mov edx, 4 
    int 0x80 
+1

您將值傳遞給sys_write。它期望一個字符串/字符的地址。即使你做'mov ecx,矩陣'然後'添加ecx,4',它仍然不起作用。您可以將矩陣定義爲雙字節字節數組或將其轉換爲ASCII碼 – Gunner 2013-03-19 16:47:24

+0

因此,無法自行輸出值?我如何將其轉換爲ASCII? – CodyBugstein 2013-03-19 16:57:21

回答

0

我期待通過this list of Linux syscalls我發現,似乎沒有要,只是打印一個字符的所有呼叫。你被困在使用sys_write(),儘管它可以打印一個字符,如果你設置EDX爲1並傳遞一個有效的指針。

認識到mov ecx, [matrix + 4]只將(matrix + 4)指向的值移動到ECX中,以便sys_write將使用該值作爲地址。由於該地址包含4,因此sys_write嘗試打印從地址0x00000004開始找到的字符串數據。這就是爲什麼它會暫停(不允許從那裏讀取)。

要將值4轉換爲適合打印的ASCII值,請將值0x30加上。 ASCII 0x30 ='0',0x31 ='1'... 0x34 ='4' ... 0x39 ='9'。

因此,對於打印位的策略是該數字加載到ECX,加的0x30,推入到您在.bss段保留一個字節(也許digit_to_ascii resb 1),然後移動的digit_to_ascii地址爲ECX在調用sys_write之前(並且僅將EDX設置爲1,因爲您只需要打印1個字節)。

瞭解這隻適用於打印1位數字。如果你想打印一個10或更高的數字,你需要通過劃分將每個數字分開並單獨打印(或者單獨寫入保留緩衝區並使用一個sys_write調用打印整個緩衝區)。

+0

單字符寫入的開銷很高,所以人們試圖不這樣做。您習慣於構建文本緩衝區(例如,您的所有數字)並輸出整個緩衝區,而不是一次輸出一個字符。這就是爲什麼沒有「print_one_character」調用。 – 2013-03-20 03:09:09

相關問題