Size: a a a

2020 March 03

В

Влад in pro.asm
почему после захода в zf_1:
источник

В

Влад in pro.asm
код заходит в zf_0
источник

IN

Ilya Nikutyn in pro.asm
Потому что ассемблер выполняется последовательно, а в конце zf_1 ты никуда не прыгнул
источник

В

Влад in pro.asm
то есть здесь будет точно так же
источник

В

Влад in pro.asm
после ZF_1:
источник

В

Влад in pro.asm
он зайдет так же в zf_0:
источник

ЕК

Евгений Красников (Jin X) in pro.asm
Кончено, точно так же.

У тебя что после mov ah,1 идёт?
mov ah,0 — это и исполнится, а ты чего ожидал? Где переход?

Метка не обозначает начало или конец какого-то блока. Это просто обозначение места, куда должен быть прыжок или где находятся какие-то данные, не более.
источник

ЕК

Евгений Красников (Jin X) in pro.asm
А когда я вижу связки вроде вот этих jz + jmp, меня аж передёргивает. Зачем тут jmp, когда можно jz заменить на jnz?
источник

ЕК

Евгений Красников (Jin X) in pro.asm
Евгений Красников (Jin X)
Кончено, точно так же.

У тебя что после mov ah,1 идёт?
mov ah,0 — это и исполнится, а ты чего ожидал? Где переход?

Метка не обозначает начало или конец какого-то блока. Это просто обозначение места, куда должен быть прыжок или где находятся какие-то данные, не более.
Никаких автоматических переходов, пропусков кода и пр. нет в ассемблере.

Даже если ты вставишь процедуру посреди кода, она выполнится (через неё не будет прыжка, т.к. proc/endp — это тоже просто метки и директивы компилятора, процессору на них плевать).

И даже если ты напишешь
 mov ah,9
 mov dx,offset abc
abc:
 db 'hello'
 int 21h

то после mov выполнится не int, а db 'hello' (а что это — см. в дизассемблере).

И т.д.
источник

В

Влад in pro.asm
Спасибо большое
источник

В

Влад in pro.asm
Уяснил
источник
2020 March 04

I

Ivan in pro.asm
Парни, я пишу обёртку _start для main под Linux x86-64, чтобы избавиться от stdlib (флаг -nostdlib для gcc).
То есть просто нужно передать argc, argv во внешний символ main, но чё-та с argv в main, который уже на C реализован, какие-то проблемы.
argc получается такой, как ожидалось.
.globl _start

_start:
 /* clear the frame pointer */
 xor %ebp, %ebp

 /* extract arguments and set up for main */
 pop %rdi
 pop %rsi

 /* The stack pointer %rsp must be aligned to a 16-byte boundary before making a call */
 and $0xfffffffffffffff0, %rsp

 call main

 /* get return value for exit call */
 mov %rax, %rdi

 /* call exit on kernel */
 mov $60, %rax
 syscall

Что я делаю не так? Плиз хелп. Асмом под i386 только в студенческие годы занимался, с x86-64 дела не имел на таком уровне.
источник

DV

Dmitrij V in pro.asm
попробуй:

pushq %rbp
movq %rsp, %rbp

вместо xor %ebp, %ebp
источник

DV

Dmitrij V in pro.asm
и символ main не обязателен если libc не линкуется...
источник

I

Ivan in pro.asm
main чисто для консистентности, чтобы выглядело как нормальная программа на C.

Если заменяю, xor %ebp, %ebp на pushq %rbp и movq %rsp, %rbp, то уже и argc становится невалидным в main :(
источник

DV

Dmitrij V in pro.asm
может main написана под 32бита и аргументы берёт из стека а не из регистров ?
источник

I

Ivan in pro.asm
Не, как раз проверено опытным путём, что main берёт аргументы из RDI и RSI — mov'ал туда магические числа и делал return argc и return argv для exitcode
источник

DV

Dmitrij V in pro.asm
не уверен, но можно попробовать :

movabsq $main, %r8
callq *%r8
источник

ЕК

Евгений Красников (Jin X) in pro.asm
Ivan
main чисто для консистентности, чтобы выглядело как нормальная программа на C.

Если заменяю, xor %ebp, %ebp на pushq %rbp и movq %rsp, %rbp, то уже и argc становится невалидным в main :(
Так, надо сначала pop сделать, а потом push.
И аргументы там разве не подряд идут в стеке (указатели подряд)?
источник

ЕК

Евгений Красников (Jin X) in pro.asm
Но вообще, внешний rbp по логике влиять не должен никак.
источник