Форум программистов, компьютерный форум, киберфорум
Assembler: Linux
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/40: Рейтинг темы: голосов - 40, средняя оценка - 4.50
67 / 17 / 0
Регистрация: 26.01.2018
Сообщений: 166
1
NASM

Вывод числа в консоль Linux

23.03.2020, 18:07. Показов 7817. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Народ, как в fasm и nasm в linux выводить числа на консоль?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.03.2020, 18:07
Ответы с готовыми решениями:

Вывод числа на консоль
Здравствуйте. Есть программа для Ассемблера. Вычисление НОК для 4 чисел(Пока в программе...

Вывод числа в консоль из регистра АХ
В программа реализован ввод чисел, некоторые арифметические действия с ними. Результат действий...

Вывод большого числа в консоль на C++
В общем делаю программу по извлечению квадратного корня из числа на с++. Но возникает проблема....

Некорректный вывод числа в консоль
Посчитал значение переменной ( проверил через дебаггер , считает правильно ), mov ax, @data ...

7
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,462
Записей в блоге: 8
23.03.2020, 18:27 2
1. используя printf из libc
2. преобразовать число в строку и вывести строку - пример в теме https://www.cyberforum.ru/post14230418.html
Если у вас 64-разрядный режим, то корректируете на соответствующие регистры и уточняете номер функции вывода (они разные для x32 и x64).

Добавлено через 2 минуты
Если числа со знаком, то сначала проверяете знак, потом при необходимости берёте модуль, в строку записываете символ "минус", а потом известным способом выводите положительное число.
1
67 / 17 / 0
Регистрация: 26.01.2018
Сообщений: 166
23.03.2020, 20:34  [ТС] 3
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
1. используя printf из libc
А вы можете пример кода привести как выводить число?
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,462
Записей в блоге: 8
23.03.2020, 20:54 4
Нет. Нет у меня Linux.
Там смысл в объявлении внешней (extrn) функции printf. Тогда перестаёт "ругаться" компилятор. А при компоновке указывается не только объектный файл создаваемой программы, но и библиотека libc.so.

Нужно поискать в подразделе Linux по слову "printf".

Добавлено через 10 минут
Пример вывода
Возведение в степень и подсчет длины строки
Считывание элементов из строки (NASM)
Ссылка, на пояснение содержимого регистров при вызове printf
Вывести число в терминал средствами существующих API или библиотек

Дальше, наверное, придётся самостоятельно...

Добавлено через 1 минуту
Компоновка с libc через ld
1
67 / 17 / 0
Регистрация: 26.01.2018
Сообщений: 166
23.03.2020, 21:37  [ТС] 5
Я в gnu assambler'e видел, там как-то по проще, a для fasm/nasm не могу найти.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 .data
printf_format:
        .string "%d\n"
 
.text
.global main
main:
        movl  $0, %eax          /* в %eax будет результат, поэтому в 
                                   начале его нужно обнулить         */
        movl  $10, %ecx         /* 10 шагов цикла                    */
 
sum:
        addl  %ecx, %eax        /* %eax = %eax + %ecx                */
        loop  sum
 
        /* %eax = 55, %ecx = 0 */
 
/*
 * следующий код выводит число в %eax на экран и завершает программу
 */
        pushl %eax
        pushl $printf_format
        call  printf
        addl  $8, %esp
 
        movl  $0, %eax
        ret
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Пример вывода
Возведение в степень и подсчет длины строки
Считывание элементов из строки (NASM)
Ссылка, на пояснение содержимого регистров при вызове printf
Вывести число в терминал средствами существующих API или библиотек
Дальше, наверное, придётся самостоятельно...
Спасибо! Почитаю.
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,462
Записей в блоге: 8
23.03.2020, 22:03 6
Так переведите с AT&T на Intel, добавьте extern printf, учтите замечание из начальных комментариев сообщения Считывание элементов из строки (NASM)
И попробуйте скомпоновать при помощи gcc.

Добавлено через 12 минут
https://stackoverflow.com/ques... embly-nasm
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
default rel            ; make [rel format] the default, you always want this.
extern printf, exit    ; NASM requires declarations of external symbols, unlike GAS
section .rodata
    format db "%#x", 10, 0   ; C 0-terminated string: "%#x\n" 
section .text
global main
main:
    sub   rsp, 8             ; re-align the stack to 16 before calling another function
 
    ; Call printf.
    mov   esi, 0x12345678    ; "%x" takes a 32-bit unsigned int
    lea   rdi, [rel format]
    xor   eax, eax           ; AL=0  no FP args in XMM regs
    call  printf
 
    ; Return from main.
    xor   eax, eax
    add   rsp, 8
    ret
Bash
1
2
3
nasm -f elf64 -o main.o main.asm
gcc -no-pie -o main.out main.o
./main.out
Добавлено через 7 минут
И тут https://www.csee.umbc.edu/port... e_64.shtml множество примеров. В частности
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
; printf1_64.asm   print an integer from storage and from a register
; Assemble: nasm -f elf64 -l printf1_64.lst  printf1_64.asm
; Link:     gcc -o printf1_64  printf1_64.o
; Run:      ./printf1_64
; Output:   a=5, rax=7
 
; Equivalent C code
; /* printf1.c  print a long int, 64-bit, and an expression */
; #include <stdio.h>
; int main()
; {
;   long int a=5;
;   printf("a=%ld, rax=%ld\n", a, a+2);
;   return 0;
; }
 
; Declare external function
        extern  printf      ; the C function, to be called
 
        SECTION .data       ; Data section, initialized variables
 
    a:  dq  5   ; long int a=5;
fmt:    db "a=%ld, rax=%ld", 10, 0  ; The printf format, "\n",'0'
 
 
        SECTION .text           ; Code section.
 
        global main     ; the standard gcc entry point
main:               ; the program label for the entry point
        push    rbp     ; set up stack frame
    
    mov rax,[a]     ; put "a" from store into register
    add rax,2       ; a+2  add constant 2
    mov rdi,fmt     ; format for printf
    mov rsi,[a]         ; first parameter for printf
    mov rdx,rax         ; second parameter for printf
    mov rax,0       ; no xmm registers
        call    printf      ; Call C function
 
    pop rbp     ; restore stack
 
    mov rax,0       ; normal, no error, return value
    ret         ; return
1
67 / 17 / 0
Регистрация: 26.01.2018
Сообщений: 166
23.03.2020, 22:26  [ТС] 7
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
https://stackoverflow.com/ques... embly-nasm

И тут https://www.csee.umbc.edu/port... e_64.shtml множество примеров. В частности
Спасибо!
0
3 / 1 / 2
Регистрация: 22.12.2020
Сообщений: 7
08.01.2021, 16:15 8
если вам не надо делать сегмент текст записываемым а сегмент дата исполняемым то в насм компилируете а линкуете гнусом, тогда можете использовать либси функции.
вот для примера для вас натаскал прогу которая создает свой левый стек получает цифирь и пихает туда выводя на экран.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
        extern  printf, scanf       ; the C function, to be called
 
        SECTION .data       ; Data section, initialized variables
fmt1    db      "Введено = %d", 0xa, 0x0
fmt2    db      "%d", 0x0
fmt3    db      "Выход. Введено = %d", 0xa, 0x0
fmt4    db      "Введено значений = %d", 0xa, 0x0
mst     dq      0x0                 ;адрес вершины стека
                SECTION .bss
inp1    resd 255
        SECTION .text           ; Code section.
 
        global main     ; the standard gcc entry point
main:               ; the program label for the entry point
        push    rbp     ; set up stack frame
    sub    rsp,8
 
        mov     rax,inp1
        mov     [mst],rax
        
 c1     mov     al,0
        mov     rdi,fmt2
        mov     rsi,[mst]
        call    scanf
        
        mov     r8,[mst]
        mov     rsi,[r8]
        cmp     rsi,0x0
        je      nul1
        
    mov rdi,fmt1        ; format for printf
    mov r8,[mst]         ; first parameter for printf
    mov    rsi,[r8]
        ;mov    rdx,rax         ; second parameter for printf
    mov rax,0       ; no xmm registers
        call    printf      ; Call C function
        
        mov     rax,[mst]
        add     rax,0x8
        mov     [mst],rax
        sub     rax,inp1
        
            mov rdi,fmt4        ; format for printf
    mov rsi,rax         ; first parameter for printf
        shr     rsi,3 
    ;mov    rdx,rax         ; second parameter for printf
    mov rax,0       ; no xmm registers
        call    printf      ; Call C function
 
        jmp     c1
        
nul1    mov rdi,fmt3        ; format for printf
    mov r9,[mst]         ; first parameter for printf
        mov     rsi,[r9]
    ;mov    rdx,rax         ; second parameter for printf
    mov rax,0       ; no xmm registers
        call    printf      ; Call C function
 
mexit   pop rbp     ; restore stack
 
    mov rax,0       ; normal, no error, return value
    
        add     rsp,8
        ret         ; return
сборку осуществлять примерно так
Bash
1
2
3
4
#!/bin/bash
p1=$1
nasm -f elf64 $p1.s -o $p1.o -l $p1.lst
cc $p1.o -o $p1
вообще используя гнус можно писать на асме со скоростью си. но.... тогда уж проще сразу на си
0
08.01.2021, 16:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.01.2021, 16:15
Помогаю со студенческими работами здесь

Вывод в консоль 2-ух Динамических массивов и 1 числа
Доброго времени суток. Происходит интересная магия в коде, которую мне не понять, но хочется...

Вывод большого числа строк в консоль
Как в консоли сделать, чтобы при выводе числа, выводимые в столбик, можно было все прокрутить и...

Некорректный вывод значения числа в консоль
Написал прогу, но чёт не то выдаёт Есть массив, с клавы вводишь число, например, 110011. Первый и...

Вывод на консоль предложений, содержащих двухзначные числа
Задание: Прочитать из файла текст, вывести на экран только те предложения, которые содержат...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru