簡體   English   中英

linux nasm打印多個字符

[英]linux nasm print multiple characters

我正在嘗試編寫一個程序,允許我打印多個字符(字符串或整數)。 我遇到的問題是我的代碼只打印其中一個字符,然后換行並保持無限循環。 這是我的代碼:

SECTION .data
len EQU 32
SECTION .bss
num resb len
output resb len

SECTION .text
GLOBAL _start
_start:
Read:
    mov eax, 3
    mov ebx, 1
    mov ecx, num
    mov edx, len
    int 80h

Point:
    mov ecx, num

Print:
    mov al, [ecx]
    inc ecx
    mov [output], al

    mov eax, 4
    mov ebx, 1
    mov ecx, output
    mov edx, len
    int 80h

    cmp al, 0
    jz Exit

Clear:
    mov eax, 0
    mov [output], eax
    jmp Print  

Exit:
    mov eax, 1
    mov ebx, 0
    int 80h 

有人能指出我做錯了什么嗎?

謝謝,

Rileyh

在第一次進入“ Print部分時, ecx指向字符串的開頭,並使用它將單個字符復制到輸出字符串的開頭。 但是更多的指令,你用指向輸出字符串的指針覆蓋ecx ,並且永遠不會恢復它,因此你永遠不會復制並打印其余的字符串。

另外,為什么用一個字符串調用write() ,目的是遍歷它以打印整個字符串? 為什么不直接傳入num而不是復制單個字符來output和傳遞?

在上一個問題中,您將message顯示為以零結尾的字符串,因此cmp al, 0將指示字符串的結尾。 sys_read不會創建以零結尾的字符串! (如果我們需要它,我們可以填充零 - 例如作為sys_open的文件名)sys_read將讀取最大的edx字符。 來自stdin的sys_read返回當且僅當命中“enter”鍵時。 如果輸入的字符少於edx字符,則字符串以換行符(10位十進制或0xA或0Ah十六進制)終止 - 您可以查找...但是,如果討厭的用戶鍵入的字符多於edx字符,則只有edx字符進入緩沖區后,“多余”仍留在操作系統的緩沖區中(以后可能會引起麻煩!)。 在這種情況下,您的字符串不會以換行符結束,因此查找它將失敗。 sys_read返回實際讀取的字符數 - 最多為edx - 包括換行符 - 在eax中。 如果您不想在長度中包含換行符,則可以減少eax。

作為一個實驗,在edx中執行一個帶有少量(例如4)的sys_read,然后退出程序。 輸入“abcdls”(輸入)並觀察“ls”的執行情況。 如果有些小丑輸入“abcdrm -rf。”......好吧,不要!

最安全的是刷新操作系統的輸入緩沖區。

  mov ecx, num mov edx, len mov ebx, 1 mov eax, 3 int 80h cmp byte [ecx + eax - 1], 10 ; got linefeed? push eax ; save read length - doesn't alter flags je good flush: mov ecx, dummy_buf mov edx, 1 mov ebx, 1 mov eax, 3 int 80h cmp byte [ecx], 10 jne flush good: pop eax ; restore length from first sys_read 

我們不是在.bss(或.data)中定義dummy_buf ,而是將它放在堆棧上 - 試圖在這里保持簡單。 這是不完美的 - 我們不知道我們的字符串是否被換行終止,並且我們不檢查錯誤(不太可能從stdin讀取)。 你會發現你正在編寫更多代碼來處理錯誤和“白痴用戶”輸入,而不是“做工作”。 必然! (這是一種低級語言 - 我們必須告訴CPU每一件事!)

sys_write也不知道零終止字符串! 無論可能有多少垃圾,它都會打印edx字符。 你想弄清楚你真正想要打印多少個字符,並把它放在edx中(這就是為什么我保存/恢復上面的原始長度)。

你提到“整數”並使用num作為變量名。 除了ascii代碼之外,這些函數都不知道“數字”。 你在讀和寫字。 將一位數字轉換為字符和從字符轉換很容易 - 加或減'0'(48位小數或30小時)。 多位數字更復雜 - 如果您需要,請查看示例。

最好,弗蘭克

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM