• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

[NASM] Переменная обнуляется сама по себе

Stepashka20

New member
18.08.2020
2
0
BIT
11
В части программы необходимо разделить 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
    ;b dw 0


Уже целый день бьюсь над ошибкой,в которой в конце кода каким-то магическим образом переменная impl_res_2 обнуляется(на 89 строке переменная хранила значение нормально,а на 95 строке она обнулилась),хотя над ней действий больше не производится.Из-за чего это может быть?
 
Решение
Братюнь, я не настоящий сварщик, к тому же привык at&t асму, но попробую покамлать. Вот например ты пишешь:

mov [fisrt],eax

first, это у тебя word, 2 байта. А eax это dword, 4 байта. Так что этот мов забьёт не только first, но и second (проверь в отладчике). Сдаётся мне, что надо делать:

mov word ptr [first], eax

или просто

mov [first], ax

, смотря какой asm у тебя. И так везде по тексту. Ты пишешь в first 4 байта, а не 2, вот где собака и она зарыта повсюду у тебя. Например:

Код:
    ;Пока impl_res_2 есть !!!!
    or eax,[fisrt]
    mov [byte4],eax ; <<<< ДУХИ ГОВОРЯТ ЗДЕСЯ!!!

    call implication
    mov [impl_res_4],r9w

ты пишешь по адресу byte4 значение eax, а в нём 4 байта, а что у нас за byte4? А там импл рез 1 и 2:

Код:
...
    byte4 dw 0...

Крампус

Green Team
09.12.2020
21
1
BIT
0
Братюнь, я не настоящий сварщик, к тому же привык at&t асму, но попробую покамлать. Вот например ты пишешь:

mov [fisrt],eax

first, это у тебя word, 2 байта. А eax это dword, 4 байта. Так что этот мов забьёт не только first, но и second (проверь в отладчике). Сдаётся мне, что надо делать:

mov word ptr [first], eax

или просто

mov [first], ax

, смотря какой asm у тебя. И так везде по тексту. Ты пишешь в first 4 байта, а не 2, вот где собака и она зарыта повсюду у тебя. Например:

Код:
    ;Пока impl_res_2 есть !!!!
    or eax,[fisrt]
    mov [byte4],eax ; <<<< ДУХИ ГОВОРЯТ ЗДЕСЯ!!!

    call implication
    mov [impl_res_4],r9w

ты пишешь по адресу byte4 значение eax, а в нём 4 байта, а что у нас за byte4? А там импл рез 1 и 2:

Код:
...
    byte4 dw 0

    impl_res_1 db 0
    impl_res_2 db 0
...

т.е. ты затираешь одним мовом 3 переменные, byte4, res1, res2. А надо так:

Код:
    mov [byte4], ax;

Думаю так.
 
Решение

Stepashka20

New member
18.08.2020
2
0
BIT
11
Братюнь, я не настоящий сварщик, к тому же привык at&t асму, но попробую покамлать. Вот например ты пишешь:

mov [fisrt],eax

first, это у тебя word, 2 байта. А eax это dword, 4 байта. Так что этот мов забьёт не только first, но и second (проверь в отладчике). Сдаётся мне, что надо делать:

mov word ptr [first], eax

или просто

mov [first], ax

, смотря какой asm у тебя. И так везде по тексту. Ты пишешь в first 4 байта, а не 2, вот где собака и она зарыта повсюду у тебя. Например:

Код:
    ;Пока impl_res_2 есть !!!!
    or eax,[fisrt]
    mov [byte4],eax ; <<<< ДУХИ ГОВОРЯТ ЗДЕСЯ!!!

    call implication
    mov [impl_res_4],r9w

ты пишешь по адресу byte4 значение eax, а в нём 4 байта, а что у нас за byte4? А там импл рез 1 и 2:

Код:
...
    byte4 dw 0

    impl_res_1 db 0
    impl_res_2 db 0
...

т.е. ты затираешь одним мовом 3 переменные, byte4, res1, res2. А надо так:

Код:
    mov [byte4], ax;

Думаю так.

Спасибо огромное!!!Как же долго возился с ошибкой и не смог даже предположить это...
 

Крампус

Green Team
09.12.2020
21
1
BIT
0
Т.е. если 2 байта, то mov [xxx], ax, а если 1, то mov [xxx], al, а если 4 то mov [xxx], eax.

Еще галку поставь бро, типа мой пост это решение, ты ТС, у тебя должна быть кнопка какая-то для этого.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!