2014-03-24 4 views
1

Последовал несколько онлайн-документов, но при попытке распечатать номер, который я сохранил в регистре% ecx, ничего не происходит. Может быть, это потому, что я выполняю вычисления, а затем пытаюсь напечатать в цикле?Распечатать запись в сборке x86

mov  $48, %ecx #Convert to ascii 
    mov  $1, %edx #Print Byte 
    add  %eax, %ecx 

    mov  $4, %eax   #Output To Console 
    mov  $1, %ebx   #File Descriptor - Standardout 
    int  $0x80   #Call the Kernel 

ответ

3

write системный вызов ожидает указатель на данные для печати. Насколько я могу судить, у вас есть одна цифра. Вы можете временно хранить, что в стеке для печати следующим образом:

mov  $48, %ecx #Convert to ascii 
mov  $1, %edx #Print Byte 
add  %eax, %ecx 
push %ecx  # store on stack 
mov  %esp, %ecx # load address 
mov  $4, %eax # Output To Console 
mov  $1, %ebx # File Descriptor - Standardout 
int  $0x80  # Call the Kernel 
pop  %ecx  # clean up stack 

Помните, что вы будете нуждаться в более рутине преобразования для многоразрядных чисел.

2

Эта система является write. В C siganture будет:

int write(int fd[ebx], char *p[ecx], int size[edx]); 

Теперь, глядя на свой код, ebx, edx и eax нормально. Но ecx является указателем на буфер, а не на символ. Кроме того, я не знаю, что

add eax, ecx 

должен делать, поскольку eax не определен в вашем фрагменте кода.

Так что вам нужно сделать, зарезервировать буфер в памяти, поместить байт (ы), который вы хотите записать в него, и указать на него ecx.

Если eax должен быть одной цифрой в диапазоне 0-9, тогда было бы более удобно читать, если вы положили mov $'0', ecx.

+1

Знак '' 'в ассемблере gnu означает' немедленный', а не шестнадцатеричный. Итак, '$ 48' был правильным. Конечно, '$ '0'' было бы еще более удобочитаемым. – Jester

+0

ОК. Я действительно не знаю синтаксиса AT & T, а из M68000 (как пример) $ будет обозначать шестнадцатеричное число (другие ассемблеры также). :) Thx для обновления. – Devolus

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