ассемблера x86 [АСМ] код, который берет число и добавляет 155 затем сдвигает вправо


Следующая программа берет пользователем вводится число и добавляет 155, смещает его вправо дважды, и отпечатки на выходе после того, после смены. Это написано в фасм сборки x86 и использует конвенция нарушением соглашения о стандартном:

format PE Console
entry main
include 'macro/import32.inc'

; Read-Only data
section '.rdata' data readable
msg db 'Enter a number and we will do some math to it: ', 0
msg2 db 13,10, 'The final result is: %d', 0, 13, 10
p db 'pause>nul', 0
msg3 db 13, 10, '%d + 155 is %d', 0
msg4 db 'You entered: %d', 0
section '.data' data readable writeable
frmspec db '%d'
number dd 0


section '.code' code readable executable

main:
push ebp
mov ebp, esp
; no local vars needed
push msg
call [printf]
sub esp, 4 ; clean stack
push number
push frmspec
call [scanf]
sub esp, 8 ; clean stack
push [number]
push msg4
call [printf]
sub esp, 8 ; clean stack

mov eax, [number]
add eax, 155
push eax
push [number]
push msg3
call [printf]
pop ecx
pop eax
pop ecx

shr eax, 2
mov dword [number], eax
push [number]
push msg2
call [printf]
sub esp, 8
mov esp, ebp
pop ebp
push p
call [system]
sub esp, 4
push 0
call [exit]

;imports
section '.idata' import data readable
library msvcrt, 'msvcrt.dll'
import msvcrt, \
printf, 'printf', \
system, 'system', \
scanf, 'scanf', \
exit, 'exit'


150
4
задан 5 марта 2018 в 11:03 Источник Поделиться
Комментарии
1 ответ


push number
push frmspec
call [scanf]
sub esp, 8 ; clean stack

Очистка стека осуществляется addющих esp. Потому что на x86 стек растет сверху вниз, чистки подразумевает движение вверх.
Вы делаете эту ошибку несколько раз!


Из постановки задачи не очень понятно, действительно ли вы хотите


  • сдвиг числа после добавления

  • сдвиг числа , как это было до добавления

Ваш код в настоящее время у последнего.

mov eax, [number]
add eax, 155
push eax
push [number] <------ Original number
push msg3
call [printf]
pop ecx
pop eax <------ Still original number
pop ecx
shr eax, 2 <------ Shifts the original number
mov dword [number], eax


frmspec db '%d'
number dd 0

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

frmspec db '%d', 0
number dd 0



msg2 db 13,10, 'The final result is: %d', 0, 13, 10

Вы разместили нуля до возврата каретки/перевода строки. Тем не выводиться как следствие!



mov dword [number], eax

ФАСМ не требует от вас, чтобы оставить этот избыточный размер тега (dword). Это не служит никакой цели.

6
ответ дан 5 марта 2018 в 01:03 Источник Поделиться