Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Первая программа на ассемблер / 4 сообщений из 4, страница 1 из 1
16.04.2014, 19:57
    #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
17.04.2014, 13:38
    #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
17.04.2014, 14:16
    #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
18.04.2014, 16:34
    #38619023
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первая программа на ассемблер
Круть. Осталось еще прогнать краевые тесты. Для особо въедливых преподов.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Первая программа на ассемблер / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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