2015-01-11 3 views
1

Вот мой код (buffer.asm)Как я могу напечатать, сколько байтов было прочитано для консоли с помощью Assembly?

section .bss 
    bufflen equ 2 
    buff: resb bufflen 

    whatreadlen equ 1 
    whatread: resb whatreadlen 

section .data 

section .text 

global main 

main: 
    nop 
    read: 
     mov eax,3   ; Specify sys_read 
     mov ebx,0   ; Specify standard input 
     mov ecx,buff  ; Where to read to... 
     mov edx,bufflen  ; How long to read 
     int 80h    ; Tell linux to do its magic 
     mov esi,eax   ; copy sys_read return value to esi 
     mov [whatread],eax ; Store how many byte reads info to memory at loc whatread 

     mov eax,4   ; Specify sys_write 
     mov ebx,1   ; Specify standart output 
     mov ecx,[whatread] ; Get the value at loc whatread to ecx 
     add ecx,0x30  ; convert digit in EAX to corresponding character digit 
     mov edx,1   ; number of bytes to be written 
     int 80h    ; Tell linux to do its work 

Когда я называю это так:

./buffer > output.txt < all.txt 

(Предположим all.txt имеет некоторый текст в нем, как "ABCDEF")

Я ожидаю увидеть номер в консоли. Однако я ничего не вижу. Что мне не хватает?

+0

Пожалуйста, обратите внимание, что вы храните в DWord EAX в месте, которое было настроить, чтобы получать байты с помощью 'RESB whatreadlen'! –

+0

@ user3144770 ах да .. вы правы. Благодарю. но не должен ли он автоматически сохранять байты длиной от eax в этой ситуации? –

ответ

1

Вы передаете значение sys_write вместо адреса, это не сработает.

Написать вместо этого:

main: 
    nop 
    read: 
     mov eax,3   ; Specify sys_read 
     mov ebx,0   ; Specify standard input 
     mov ecx,buff  ; Where to read to... 
     mov edx,bufflen  ; How long to read 
     int 80h    ; Tell linux to do its magic 
     mov esi,eax   ; copy sys_read return value to esi 
     add eax, 30h  ;; Convert number to ASCII digit 
     mov [whatread],eax ; Store how many byte reads info to memory at loc whatread 

     mov eax,4   ; Specify sys_write 
     mov ebx,1   ; Specify standart output 
     lea ecx,[whatread] ;; Get the address of whatread in ecx 
     mov edx,1   ; number of bytes to be written 
     int 80h    ; Tell linux to do its work 

Здесь мы превращения нашей (надеюсь, одна цифра) возвращаемое значение из sys_read в ASCII цифры, хранить его в whatread, то говорить sys_write писать от whatread, как будто это был указателем на строку из 1 символа (что и есть).

И проверить его с echo aaa | ./buffer > output.txt

+0

Теперь я получаю: ошибка сегментации (сбрасывание ядра) –

+0

@KorayTugay. Тогда это, вероятно, проблема с остальной частью вашего кода, я просто проверил этот фрагмент :). Добавьте «mov eax, 1; mov ebx, 0; int 80h' сразу после этого кода в sys_exit (0) и посмотреть, работает ли он. – tux3

+0

спасибо, позвольте мне попробовать –

Смежные вопросы