Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: Linux
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/12: Рейтинг темы: голосов - 12, средняя оценка - 4.83
pcmax
15 / 15 / 2
Регистрация: 29.01.2018
Сообщений: 422
1

Ввод числа с клавиатуры, сравнение его с константой и вывод соответствующей строки

17.08.2018, 18:25. Просмотров 2261. Ответов 81
Метки нет (Все метки)

вобщем ребята те же грабли.

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


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
.bss
num:  .space 4
.data
      stroka:
                .ascii " те же грабли \n"
                 .set len, . -stroca
.text 
         .global _start
_start:
          mov $3, %rax
          mov $0, %rbx
          mov $num, %rcx
          mov $4, %rdx
           int $0x80
 
          cmp '8',  (num)
          jg    to
 
          jmp stop
 
         to:
          mov $4, %rax
          mov $1, %rbx
          mov $stroka, %rcx
          mov $len, %rdx
          int $0x80
          jmp stop
 
          stop:
          mov $1, %rax
          int $0x80
не могу разобраться cmp. как правильно написать, операнды, то ли в скобках, то ли в кавычках. то ли без


подскажите
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2018, 18:25
Ответы с готовыми решениями:

TASM. Ввод числа с клавиатуры и вывод на экран.
Помогите с написание программы. Я ввожу число с клавиатуры и потом его же мне...

[NASM] Ввод символа с клавиатуры, вывод на экран символа и его кода в десятичной записи
Доброе время суток. Нужно написать программу на ассемблере, которая...

Ввод десятичного числа в диапазоне 0-255 и вывод его значения в двоичной системе.
Ввод десятичного числа в диапазоне 0-255 и вывод его значения в двоичной...

Ввод десятичного числа в диапазоне 0-255 и вывод его значения в двоичной системе
Напишите программу плз. Ввод десятичного числа в диапазоне 0-255 и вывод его...

Вывод на экран и ввод с клавиатуры
Здравствуйте! Скажите пожалуйста У меня есть два кусочка Вывод на экран ...

81
ОС
327 / 80 / 1
Регистрация: 21.07.2018
Сообщений: 112
Записей в блоге: 1
17.08.2018, 19:05 2
Когда поменяете
Assembler
1
2
         
cmp $'8',  num
(или $8)


увидите следующую знакомую опечатку

Assembler
1
2
         
         .set len, . -stroka
Вы решили для 64битного линукса кодить?
В нём системные вызовы те же, но по-другому.
1
pcmax
15 / 15 / 2
Регистрация: 29.01.2018
Сообщений: 422
17.08.2018, 19:16  [ТС] 3
Цитата Сообщение от ОС Посмотреть сообщение
Вы решили для 64битного линукса кодить?
просто изучаю 64 версию

мне блин этот учебник говорит, что если я сделаю так $num то возьму адрес. но я то уже научен)))) я знаю , что нет никаких адресов. этому две темы посвятил в которых выяснял про них и услышал много добрых слов в свой адрес.

поэтому я посмотрел и решил взять (num) в скобки, чтобы Ассемблер вытащил значение из памяти, которое помечанно меткой num и сравнил его с числом 8.
вобщем сейчас буду пытаться уложить в голове все что есть и чтобы не шло в разрез
0
ОС
327 / 80 / 1
Регистрация: 21.07.2018
Сообщений: 112
Записей в блоге: 1
17.08.2018, 19:31 4
Почитайте в важной статье про то, как это делается в 64битном линуксе

Системные вызовы в Linux
syscall вместо int 128 и другие регистры.
1
pcmax
15 / 15 / 2
Регистрация: 29.01.2018
Сообщений: 422
17.08.2018, 19:41  [ТС] 5
Цитата Сообщение от ОС Посмотреть сообщение
Почитайте в важной статье про то, как это делается в 64битном линуксе
в моем случае какой вызов использовать?
прога выполняет все, и не делает прыжок
0
ОС
327 / 80 / 1
Регистрация: 21.07.2018
Сообщений: 112
Записей в блоге: 1
17.08.2018, 20:05 6
А что Вы хотите получить?
Как должна работать программа?
1
pcmax
15 / 15 / 2
Регистрация: 29.01.2018
Сообщений: 422
17.08.2018, 20:08  [ТС] 7
сравнить значение введенное мною с клавиатуры, и если больше или меньше, то или вывести на экран строку, с содержанием те же грабли, или просто закончить ничего не сделав.
но программа выводить строку при любом раскладе, чтобы я не ввел) такое чувство, что gl ни jmp не работают вообще. просто код читается сверху вниз и выполняется
1
mizannny
Заблокирован
17.08.2018, 20:23 8
cmp не получится использовать так, как ты хочешь. С терминала в буфер кладутся коды символов. Их нужно перевести в число, а потом только сравнивать.
1
pcmax
15 / 15 / 2
Регистрация: 29.01.2018
Сообщений: 422
17.08.2018, 20:29  [ТС] 9
Цитата Сообщение от mizannny Посмотреть сообщение
cmp не получится использовать так, как ты хочешь. С терминала в буфер кладутся коды символов. Их нужно перевести в число, а потом только сравнивать.
как перевести?
что надо сделать?
я же вроде взял '8' именно так я возьму код
0
mizannny
Заблокирован
17.08.2018, 20:36 10
Цитата Сообщение от pcmax Посмотреть сообщение
как перевести?
Ручками. Или звать функцию из сишного рантайма вроде atoi.
Цитата Сообщение от pcmax Посмотреть сообщение
что надо сделать?
Написать код.
Цитата Сообщение от pcmax Посмотреть сообщение
я же вроде взял '8' именно так я возьму код
Ты не понимаешь, ты в самом подходе ошибся. В линуксе нет системного вызова "прочитать число". Все что он читает - это символы. Коды которых потом склыдываются в буфер. То '8', которую ты написал, это не число, а символ.
1
pcmax
15 / 15 / 2
Регистрация: 29.01.2018
Сообщений: 422
17.08.2018, 20:46  [ТС] 11
я полностью согласен, что не понимаю...
что бы я тогда тут нудил выпрашивая подсказки.


вобщем что надо написать, чтобы работало?
0
ОС
327 / 80 / 1
Регистрация: 21.07.2018
Сообщений: 112
Записей в блоге: 1
17.08.2018, 20:46 12
pcmax У Вас не получается ввести то, с чем программа сравнивает.
если как-нибудь так запускать

Bash
1
echo -e '8\0\0\0' | ./ваша_программа
или сравнивать только первый байт, поменять на cmpb
1
pcmax
15 / 15 / 2
Регистрация: 29.01.2018
Сообщений: 422
17.08.2018, 20:48  [ТС] 13
вернее как надо написать, чтобы он понимал, что это число?
напишите

Добавлено через 1 минуту
Цитата Сообщение от ОС Посмотреть сообщение
У Вас не получается ввести то, с чем программа сравнивает.
если как-нибудь так запускать
объясните подробнее в чем там дело
0
ОС
327 / 80 / 1
Регистрация: 21.07.2018
Сообщений: 112
Записей в блоге: 1
17.08.2018, 20:48 14
'8' можно поменять на другой символ, например '*'
1
pcmax
15 / 15 / 2
Регистрация: 29.01.2018
Сообщений: 422
17.08.2018, 20:52  [ТС] 15
Цитата Сообщение от ОС Посмотреть сообщение
ли сравнивать только первый байт, поменять на cmpb
__________________
поменял. непомогло к сожалению

Добавлено через 1 минуту
Цитата Сообщение от ОС Посмотреть сообщение
8' можно поменять на другой символ, например '*'

то есть мне надо зайти в таблицу ascii узнать код числа 8 и прописать его в cmp? но в num тоже лежит лишь символ.
как быть то?
0
ОС
327 / 80 / 1
Регистрация: 21.07.2018
Сообщений: 112
Записей в блоге: 1
17.08.2018, 20:53 16
Сколько символов считалось в num?
1
pcmax
15 / 15 / 2
Регистрация: 29.01.2018
Сообщений: 422
17.08.2018, 20:54  [ТС] 17
Цитата Сообщение от pcmax Посмотреть сообщение
8' можно поменять на другой символ, например '*'
получится , что я сравниваю опять код из ascii и символ в num

Добавлено через 59 секунд
Цитата Сообщение от ОС Посмотреть сообщение
Сколько символов считалось в num?
ну я вводил с клавиатуры однозначные символы типа 1 и до 9
0
ОС
327 / 80 / 1
Регистрация: 21.07.2018
Сообщений: 112
Записей в блоге: 1
17.08.2018, 21:06 18
С кодом as справится
Bash
1
2
3
4
5
6
7
8
9
10
 echo "cmpb $'8',7" | as ; objdump -d
 
a.out:     file format elf64-x86-64
 
 
Disassembly of section .text:
 
0000000000000000 <.text>:
   0:   80 3c 25 07 00 00 00    cmpb   $0x38,0x7
   7:   38
Какая в точности сейчас у Вас команда сравнения? Не могли бы скопировать?
Или у Вас код не собирается и Вы проверяете старую версию?

Bash
1
objdump -d имявашейпрограммы
что говорит?
1
pcmax
15 / 15 / 2
Регистрация: 29.01.2018
Сообщений: 422
17.08.2018, 21:16  [ТС] 19
Цитата Сообщение от ОС Посмотреть сообщение
акая в точности сейчас у Вас команда сравнения? Не могли бы скопировать?
Или у Вас код не собирается и Вы проверяете старую версию?

у меня вывод в терминале один в один, как был у Вас выше. буква в букву
0
mizannny
Заблокирован
17.08.2018, 22:36 20
Цитата Сообщение от pcmax Посмотреть сообщение
вернее как надо написать, чтобы он понимал, что это число?
напишите
Кто украл слово "пожалуйста"? Или это требование? Мне было очень лениво, но я набросал код под nasm, который считывает число и сравнивает его (со 100 в моем примере):

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
section .bss
 
input_str:      resb 32
 
section .data
 
welcome_str:    db "input number: "
welcome_len:    equ $ - welcome_str
 
greater_str:    db "Greater.", 10
greater_len:    equ $ - greater_str
 
lesser_str:    db "Lesser.", 10
lesser_len:    equ $ - lesser_str
 
equal_str:    db "Equal.", 10
equal_len:    equ $ - equal_str
 
section .text
 
global _start
 
convert_str_to_num: ; rdi - buf pointer, rsi - buf len
movsxd rsi, esi
lea rsi, [rdi + rsi * 1 - 2] ; position of last digit, skipping newline character
cmp rdi, rsi
ja  .end
sub rdi, 1
mov edx, 1
xor eax, eax
 
.str_iteration: movsx ecx, byte [rsi]
sub  rsi, 1
sub  ecx, '0'
imul ecx, edx
 
lea edx, [rdx + rdx * 4]
add edx, edx
 
add eax, ecx
cmp rsi, rdi
jne .str_iteration
ret
.end: xor eax,eax
ret    
 
print: ; rdi - buf, rsi - count
mov rdx, rsi
mov rsi, rdi
mov rdi, 1
mov rax, 1 ; write
syscall
ret
 
_start:
; write welcome
mov rdi, welcome_str
mov rsi, welcome_len
call print
 
; read input
mov rsi, input_str
mov rdx, 32
mov rdi, 0
mov rax, 0 ; read
syscall
 
; conversion
mov rsi, rax
mov rdi, input_str
call convert_str_to_num
 
; comparison and output
cmp rax, 100
jg .greater
je .equal
 
mov rdi, lesser_str
mov rsi, lesser_len
call print
jmp .end
 
.equal:
mov rdi, equal_str
mov rsi, equal_len
call print
jmp .end
 
.greater:
mov rdi, greater_str
mov rsi, greater_len
call print
 
.end:
mov rdi,0
mov rax, 60 ; exit
syscall
 
ret
Ассемблер он и в Африке ассемблер, конветнуть между nasm, as, yasm и т. п. - дело банальной техники. Код конвертации строки в число, соответственно, фукнция с именем convert_str_to_num. Вот пример компиляции и работы приложения:
Код
$ nasm -f elf64 main.asm && ld main.o
$ ./a.out
input number: 123
Greater.
$ ./a.out
input number: 99
Lesser.
$ ./a.out
input number: 100
Equal.
$ ./a.out
input number: 123213
Greater.
1
17.08.2018, 22:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2018, 22:36

Ввод с клавиатуры записи и вывод.
Нужно зделать ввод с клавиатуры записи i1 и потом вывод на экран помогите. ...

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

Ввод числа с клавиатуры
нужно ввести с клавиатуры число(будущее количество эл-в маллива). число от 1 до...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru