powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Первая программа на ассемблер
4 сообщений из 4, страница 1 из 1
Первая программа на ассемблер
    #38616900
ALEX7676
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем здравствуйте. Написал вот такой код, в котором по видимому есть косяки. Помогите исправить, пожалуйста. Спасибо.
Посчитать значение выражения и вывести ответ на экран.
;(-2*c – d + 53)/(a/4 – 1)


stak segment para stack 'stack'
db 64 dup(?)
stak ends
data segment para public 'data'
A DB 5; A=5
D DB 6; D=6
C DB 7; C=7
REZ DW ?
al DB ?
B1 DB ?
cl Db ?
D1 Db ?
DN Db ?
N Db ?
data ends
code segment para public 'code'
s: assume ds:data, cs:code, ss:stak
MOV ax,data
MOV ds,ax

;(a/4 – 1)

MOV al, A ;<al>=A
CBW ;<al>=><ax>
MOV bl, 4 ;<bl>=4
Idiv bl ;<al>=<ax>/<bl>
CBW
DEC AX ; <ax>=<ax>-1
MOV DN, AX ; <dn>=<ax>

;(-2*c – d + 53)

MOV al, C ; <al>=C
CBW ; <al>=><ax>
MOV B1, -2 ; <B1>=-2
IMUL B1 ; <al>=<ax>-<B1>
MOV BX, AX ; <BX>=<AX>
MOV cl, D ; <cl>=><D>
MOV AX, cl ; <AX>=<cl>
CBW
SUB BX, AX ; <BX>=<BX>-<AX>
MOV D1, 53 ; <D1>=53
ADD BX, D1 ; <BX>=<BX>+<D1>
MOV N,BX ; <N>=<BX>
CWD ;<ax>=> <dx:ax>
Idiv dn ;<ax>=<dx:ax>/dn
MOV REZ, ax ;REZ=<ax>
MOV AH, 4CH
INT 21H
CODE ENDS
END S
...
Рейтинг: 0 / 0
Первая программа на ассемблер
    #38617485
For All
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не стоит давать имена переменным совпадающими c названиями регистров:name=ALEX7676 ...
al DB ?
cl Db ?
...

Не совсем уверен, что можно делать mov из 8-битного регистра в 16-битный как у вас:
Код: asm
1.
mov bx,cl

правильнее будет:
Код: asm
1.
mov bx,cx


умножения/деления на числа кратные 2 (2^n) красивее делать через левый/правый сдвиг на число битов равное n (а не через imul):
Код: asm
1.
2.
3.
4.
5.
6.
; -2*ax
shl ax, 1
neg ax
...
; bx/4
sar bx, 2 ; арифметический сдвиг вправо, который сохраняет знак (+/-) числа в BX
...
Рейтинг: 0 / 0
Первая программа на ассемблер
    #38617543
Strangecat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
For Allумножения/деления на числа кратные 2 (2^n) красивее делать через левый/правый сдвиг на число битов равное n (а не через imul):
Код: asm
1.
2.
; bx/4
sar bx, 2 ; арифметический сдвиг вправо, который сохраняет знак (+/-) числа в BX



Если число беззнаковое/положительное, то просто сдвигом можно. А вот с отрицательными получается фигня: http://en.wikipedia.org/wiki/Arithmetic_shift


Arithmetic shifts can be useful as efficient ways of performing multiplication or division of signed integers by powers of two. Shifting left by n bits on a signed or unsigned binary number has the effect of multiplying it by 2^n. Shifting right by n bits on a two's complement signed binary number has the effect of dividing it by 2^n, but it always rounds down (towards negative infinity). This is different from the way rounding is usually done in signed integer division (which rounds towards 0). This discrepancy has led to bugs in more than one compiler. [3]
...
Рейтинг: 0 / 0
Первая программа на ассемблер
    #38619023
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Круть. Осталось еще прогнать краевые тесты. Для особо въедливых преподов.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Первая программа на ассемблер
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]