|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
22.01.2018, 21:30 | #1 |
Новичок
Джуниор
Регистрация: 22.01.2018
Сообщений: 1
|
Задача инфиксные, префиксные выражения на языке Ассемблер
Есть задача:
Написать процедуру translate, которая переводит выражение (исходную строку), записанную в обычной (инфиксной) форме в постфиксную форму. Исходную строку ввести с клавиатуры, результат вывести на экран. Для решения использовать стек. Есть программа, написанная на языке ассемблера с синтаксисом AT&T: .text .globl getPriotiry #В %eax находится код символа для которого нужно получить приоритет .type getPriority, @function getPriority: pushl %ebp movl %esp, %ebp movl 8(%esp), %eax cmpl $42, %eax # * je priority3 cmpl $47, %eax # / je priority3 cmpl $43, %eax # + je priority2 cmpl $45, %eax # - je priority2 cmpl $40, %eax # ( je priority1 cmpl $41, %eax # ) je priority5 #в остальных случаях приоритет символа -- 0 movl $0, %eax jmp exit priority3: # * and / movl $3, %eax jmp exit priority2: # + and - movl $2, %eax jmp exit priority1: # ( movl $1, %eax jmp exit priority5: # ) movl $5, %eax jmp exit exit: leave ret .size getPriority, .-getPriority #Положить элемент в стэк .text .globl stack_push .type stack_push, @function stack_push: pushl %ebp movl %esp, %ebp #первый параметр -- адрес стека, второй -- что класть movl 8(%ebp), %eax cmp $50, %eax #небольшой костыль. если второй параметр -- адрес, то обрабатываем его соответствующим образом, иначе как просто число -- код символа jg address movl %eax, %edx jmp number address: movzbl (%eax), %ebx number: movzbl 12(%ebp), %edx movl %edx, (%eax, %ebx, 1) #увеличиваем счетчик стека movl 8(%ebp), %eax addl $1, (%eax) leave ret .size stack_push, .-stack_push #------------------------------------------------------------------- #Взять верхний элемент и вернуть его значение .text .globl stack_pop .type stack_pop, @function stack_pop: pushl %ebp movl %esp, %ebp #уменьшить значение счетчика стека movl 8(%ebp), %eax subl $1, (%eax) movzbl (%eax), %ebx #взять верхний элемент movzbl (%eax, %ebx, 1), %eax # movzbl %edx, %eax leave ret .size stack_pop, .-stack_pop #------------------------------------------------------------------- #Возвращает 0 если стек не пустой. Иначе 1 .text .globl stack_isEmpty .type stack_isEmpty, @function stack_isEmpty: pushl %ebp mov %esp, %ebp movl 8(%esp), %eax movzbl (%eax), %eax cmpl $1, %eax movl $0, %eax jg exit movl $1, %eax exit: leave ret .size stack_isEmpty, .-stack_pop #------------------------------------------------------------------- # Возвращает размер стека .text .globl stack_size .type stack_size, @function stack_size: pushl %ebp movl %esp, %ebp movl 8(%esp), %eax movzbl (%eax), %eax subl $1, %eax leave ret .size stack_size, .-stack_size #------------------------------------------------------------------- # Возвращает просто значение верхнего элемента .text .globl stack_top .type stack_top, @function stack_top: pushl %ebp movl %esp, %ebp movl 8(%esp), %eax movzbl (%eax), %ebx subl $1, %ebx movzbl (%eax, %ebx, 1), %eax leave ret .size stack_top, .-stack_size Нужна помощь, переписать программу на языке ассемблера с синтаксисом Intel !!! |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Помогите найти ошибку в коде ассемблер (вычислить значение выражения)! | Tobisom | Помощь студентам | 0 | 29.03.2016 20:25 |
Нужно найти значение выражения на языке си (С) | Ginks111 | Помощь студентам | 3 | 27.11.2014 11:02 |
Представить математическую запись выражения на языке С ++ | geostroy1 | Помощь студентам | 4 | 09.11.2014 15:40 |
Вычислить значение выражения на языке паскаль | Black Panther | Помощь студентам | 5 | 04.12.2012 15:59 |
Вычисление выражения (найти сумму ряда) (Ассемблер) | RikkiTan | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 3 | 25.03.2012 12:53 |