Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2020, 21:12   #1
Stepanwert
Новичок
Джуниор
 
Регистрация: 14.02.2018
Сообщений: 1
Печаль Переменная обнуляется сама по себе

В части программы необходимо разделить 4 байта числа по байту,а затем каждые провести импликацию половинок байта.Так как массивы запретили пришлось использовать 4 переменные.
Код:
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
Уже целый день бьюсь над ошибкой,в которой в конце кода каким-то магическим образом переменная impl_res_2 обнуляется(на 89 строке переменная хранила значение нормально,а на 95 строке она обнулилась),хотя над ней действий больше не производится.Из-за чего это может быть?
Stepanwert вне форума Ответить с цитированием
Старый 10.12.2020, 06:21   #2
AbakBarama
Пользователь
 
Регистрация: 12.05.2011
Сообщений: 57
По умолчанию

Это ваши данные:
Код:
. . .
byte4      dw 0
impl_res_1 db 0
impl_res_2 db 0
. . .
А это код:
Код:
mov [byte4],eax
Так что ничего удивительного.
AbakBarama вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вообщем власть устраивает революцию сама себе Alar Свободное общение 59 21.03.2014 14:02
Глобальная переменная сама обнуляется DIMMUA Общие вопросы Delphi 18 17.09.2012 07:46
Обнуляется переменная Leonid183 Visual C++ 0 27.10.2011 16:06
Переменная типа String "обнуляется" при испоьзовании TTimer (Delphi) world12_tk Помощь студентам 4 24.03.2011 03:45
Обнуляется переменная Hippie Помощь студентам 1 09.01.2010 20:22