Stepashka20
New member
В части программы необходимо разделить 4 байта числа по байту,а затем каждые провести импликацию половинок байта.Так как массивы запретили пришлось использовать 4 переменные.
Уже целый день бьюсь над ошибкой,в которой в конце кода каким-то магическим образом переменная impl_res_2 обнуляется(на 89 строке переменная хранила значение нормально,а на 95 строке она обнулилась),хотя над ней действий больше не производится.Из-за чего это может быть?
Код:
section .text
global _start
_start:
mov eax,[givenNum];Извлекаем первую половинку байта
and eax,0Fh
mov [fisrt],eax
mov eax,[givenNum]
sar eax,4 ;сдвигаем начальное число,чтобы получить последнюю половинку байта
mov [givenNum],eax
mov eax,[givenNum] ;Извлекаем вторую половинку байта
and eax,0Fh
mov [second],eax
mov eax,[givenNum]
sar eax,4 ;сдвигаем начальное число,чтобы получить в дальнейшем получить следующие пол байта
mov [givenNum],eax
mov eax,[second] ;Далее соединяем 2 половинки байта в байт
shl eax,4
or eax,[fisrt]
mov [byte1],eax
call implication ;Проводим импликацию с двумя половинками байта
mov [impl_res_1],r9w ;Записываем результат импликации
;==== Далее идут аналогичные конструкции до конца 4-х байт
mov eax,[givenNum]
and eax,0Fh
mov [fisrt],eax
mov eax,[givenNum]
sar eax,4
mov [givenNum],eax
mov eax,[givenNum]
and eax,0Fh
mov [second],eax
mov eax,[givenNum]
sar eax,4
mov [givenNum],eax
mov eax,[second]
shl eax,4
or eax,[fisrt]
mov [byte2],eax
call implication
mov [impl_res_2],r9w
;====
mov eax,[givenNum]
and eax,0Fh
mov [fisrt],eax
mov eax,[givenNum]
sar eax,4
mov [givenNum],eax
mov eax,[givenNum]
and eax,0Fh
mov [second],eax
mov eax,[givenNum]
sar eax,4
mov [givenNum],eax
mov eax,[second]
shl eax,4
or eax,[fisrt]
mov [byte3],eax
call implication
mov [impl_res_3],r9w
;====
mov eax,[givenNum]
and eax,0Fh
mov [fisrt],eax
mov eax,[givenNum]
sar eax,4
mov [givenNum],eax
mov eax,[givenNum]
and eax,0Fh
mov [second],eax
mov eax,[givenNum]
sar eax,4
mov [givenNum],eax
mov eax,[second]
shl eax,4
;Пока impl_res_2 есть !!!!
or eax,[fisrt]
mov [byte4],eax
call implication
mov [impl_res_4],r9w
;Уже impl_res_2 ноль !!!!
; Terminate program
mov eax,1 ; 'exit' system call
mov ebx,0 ; exit with error code 0
int 80h ; call the kernel
implication: ;проводит импликацию с переменными fisrt и second.Результат в r9w
mov r9w,[fisrt]
not r9w
or r9w,[second]
and r9w,0Fh
ret
NewLine: ;Перевод на новую строку
mov eax,4
mov ebx,1
mov ecx,msg3
mov edx,len3
int 80h
ret
print_num: ;Вывод байта
mov r9d, 0x80 ; единица в старшем бите
mov ebx, 8
l1: dec ebx
mov r10d, r9d
and r10d, r8d ;побитово умножить r10d на r8d (в r10d)
cmp r10d, 0
jz out0 ;если r10d == 0, то перейти на out0
;через sys_write вывести '1'
mov rax, sys_write
mov rdi, 1
mov rsi, msg1
mov rdx, 1
syscall
jmp cont;перейти на cont
out0:
;через sys_write вывести '0'
mov rax, sys_write
mov rdi, 1
mov rsi, msg0
mov rdx, 1
syscall
cont:
shr r9d, 1 ;сдвинуть r9d на 1 вправо
cmp ebx, 0
jnz l1 ; условный прыжок
mov rax, sys_write
mov rdi, 1
mov rsi, 10
mov rdx, 1
syscall
ret
section .data
msg3 db 10
len3 equ $- msg3
sys_exit equ 60
sys_write equ 1
msg0 db '0'
msg1 db '1'
givenNum dq 0xDEADBEEF
byte1 dw 0
byte2 dw 0
byte3 dw 0
byte4 dw 0
impl_res_1 db 0
impl_res_2 db 0
impl_res_3 db 0
impl_res_4 db 0
fisrt dw 0
second dw 0
tmp dw 0
;b dw 0
Уже целый день бьюсь над ошибкой,в которой в конце кода каким-то магическим образом переменная impl_res_2 обнуляется(на 89 строке переменная хранила значение нормально,а на 95 строке она обнулилась),хотя над ней действий больше не производится.Из-за чего это может быть?