|
|
|
Первая программа на ассемблер
|
|||
|---|---|---|---|
|
#18+
Всем здравствуйте. Написал вот такой код, в котором по видимому есть косяки. Помогите исправить, пожалуйста. Спасибо. Посчитать значение выражения и вывести ответ на экран. ;(-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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2014, 19:57 |
|
||
|
Первая программа на ассемблер
|
|||
|---|---|---|---|
|
#18+
Не стоит давать имена переменным совпадающими c названиями регистров:name=ALEX7676 ... al DB ? cl Db ? ... Не совсем уверен, что можно делать mov из 8-битного регистра в 16-битный как у вас: Код: asm 1. правильнее будет: Код: asm 1. умножения/деления на числа кратные 2 (2^n) красивее делать через левый/правый сдвиг на число битов равное n (а не через imul): Код: asm 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2014, 13:38 |
|
||
|
Первая программа на ассемблер
|
|||
|---|---|---|---|
|
#18+
For Allумножения/деления на числа кратные 2 (2^n) красивее делать через левый/правый сдвиг на число битов равное n (а не через imul): Код: asm 1. 2. Если число беззнаковое/положительное, то просто сдвигом можно. А вот с отрицательными получается фигня: 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] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2014, 14:16 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=38619023&tid=1341395]: |
0ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
172ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
30ms |
get tp. blocked users: |
1ms |
| others: | 200ms |
| total: | 437ms |

| 0 / 0 |
