Другие языки программирования и технологии

Будет ли работать программа? ассемблер.

Нет возможности воспользоваться отладчиком. написал код. Хочу знать будет ли он работать.
в целом надо передать в вызываемую функцию параметр N по значению. Вернуть параметр 2N по ссылке.

mov ax,06h; передать параметр N в функцию delay (передача по значению)
mov dx,00h;
call delay
delay :
mov bx,ax; получить параметр
replay:
nop
dec bx
cmp bx,dx; bx = 0 ?
JNE replay; нет. Перейти к метке
mov bx,02h
mul bx; получение значения 2N
mov bx,ax
lea si,[bx]; получение адресса по которому находится значение 2N (правильно ли я использовал эту команду? )
mov ax,[si] ; возвратить значение 2N (возврат по ссылке)
ret ;возврат из подпрограммы
Илья Данилюк
Илья Данилюк
3 499
mov ax,06
mov dx,00
call delay

delay:
mov bx,ax

зачем танцы с регистрами... .
push 6
call delay
delay:
pop bx

тоже не оптимальный вариант
dec bx
cmp bx,dx; bx = 0 ?
JNE replay;

Смотри переход JNZ по флагу ...если нет нуля

dec bx
jnz replay

да и са м цикл нафига ?

push 6
call delay
delay:
pop ax
shl ax,1

// БРЕД
lea si,[bx]; получение адресса по которому находится значение 2N (правильно ли я использовал эту команду? ) /
mov ax,[si] ; возвратить значение 2N (возврат по ссылке)

2N находится в регистре. . получить адрес регистра? ))

mov rezult,ax
lea ax,rezult
ret
Евгений Вараксин
Евгений Вараксин
4 924
Лучший ответ
Почти всё верно. Я бы только исправил:
- после call delay поставь ret (иначе у тебя delay будет 2 раза вызываться)
- команда mul bx не умножает bx на 2, а перемножает bx (со значением 2) и ax (а там у тебя 6 судя по коду) лучше замени эту команду на add - она быстрее работает (типа так: mov ax, bx; add bx;).
- с lea немного напутали. да и как можно вообще число хранимое в регистре процессора передавать по ссылке? Ведь оно вообще не хранится в памяти и адреса не имеет. оперативная память и регистры процессора это разные вещи. получается чтобы передать значение по ссылке нужно записать это число в память на любой свободный адрес и потом передавать этот адрес.
в bx хранится число 2N

оператор [bx] загружает значение, хранящееся в памяти по адресу 2N - что там хранится неизвестно

lea si,[bx] загружает смещение этого значения - то есть в si будет храниться в лучшем случае 2N
mov ax,[si] опять загружает значение по адресу 2N
Роман Сажин
Роман Сажин
22 045