Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Помогите найти ошибку в программе


Автор: bncom 16.2.2007, 18:27
Вот программа:

Код

;НАЧАЛО -> X3-X2 -> X1=-X1 -> X2*X4 -> X3*2^-3 -> X1+X4+CF -> КОНЕЦ
;в числах:
;НАЧАЛО -> 16611-(-11074) -> 2=(-2) -> -11074*(-5537) -> 16611*2^-3 -> 2+(-5537)+CF -> КОНЕЦ
;================================================== 
;Входные переменные 
;--------------------------------------------------
;X1=2=2H 
;X2=-11074=65536-11074=54462=D4BEH 
;X3=16611=40E3H 
;X4=-5537=65536-5537=59999=EA5FH 
;--------------------------------------------------
;Выходные переменные 
;--------------------------------------------------
;Y1=X3-X2 
;X1=(–X1) 
;Y2=X2*X4 
;Y3=X3*2^(-3) = X3/(2^3) 
;Y4=X1+X4+CF 
;================================================== 
TITLE      Практическвя работа 
CSEG       SEGMENT  PARA PUBLIC 'CODE' 
           ASSUME   CS:CSEG,DS:CSEG,ES:CSEG 
           ORG 100H 
;================================================== 
EASY_PROG  PROC     NEAR 
           JMP      SHORT BEGIN 
;-------------------------------------------------- 
;                Область данных программы 
;-------------------------------------------------- 
X1         DW       0002H 
X2         DW       0D4BEH 
X3         DW       40E3H 
X4         DW       0EA5FH 
Y1         DW       0000H 
Y2_L       DW       0000H 
Y2_H       DW       0000H 
Y3         DW       0000H 
Y4         DW       0000H 
;-------------------------------------------------- 
;                   Задание №1 
;-------------------------------------------------- 
BEGIN:     MOV      AX,X2    ; AX <-- X2 
           MOV      BX,X3    ; BX <-- X3 
           SUB      AX,BX    ; AX <-- Y1=X3-X2 
           MOV      Y1,AX    ; сохраняем в памяти 
;-------------------------------------------------- 
;                   Задание №2 
;-------------------------------------------------- 
           NEG      X1       ; инверируем X1 пряио в памяти 
;-------------------------------------------------- 
;                   Задание №3 
;-------------------------------------------------- 
           MOV      AX,X2    ; AX <-- X2 
           MOV      BX,X4    ; BX <-- X4 
           IMUL     BX       ; DX:AX <-- Y2=X2*X4 
           MOV      Y2_L,AX  ; сохраняем в памяти 
;                              младший байт 
           MOV      Y2_H,DX  ; сохраняем в памяти 
;                              старший байт 
;-------------------------------------------------- 
;                   Задание №4 
;-------------------------------------------------- 
           MOV      AX,X3    ; AX <-- X3 
           MOV      CL,3 
           SAR      AX,CL    ; 3 сдвига AX вправо 
;                              эквивалентно          
;                              AX <-- Y3=X3/(2^3) 
           MOV      Y3,AX    ; сохраняем в памяти 
;-------------------------------------------------- 
;                   Задание №5 
;-------------------------------------------------- 
           MOV      AX,X1    ; AX <-- X1 
           MOV      BX,X4    ; BX <-- X4 
           ADC      AX,BX    ; AX <-- Y4=X1+X4+CF 
           MOV      Y4,AX    ; сохраняем в памяти 
;================================================== 
EASY_PROG  ENDP 
CSEG       ENDS 
           END      EASY_PROG

Почему-т оона не транслируется в Turbo Assembler v4.1
Пишет, что найдена одна ошибка.

В чем может быть проблема?

Автор: piritus 16.2.2007, 18:47
у меня все ровно...
а какую ошибку у тебя выдает и с какими парамертами компилишь?

Автор: JAPH 16.2.2007, 18:55
А какая ошибка? Приведите текст. А то TASM v3.2 её спокойно компилирует, линкер лишь жалуется на отсутствие стэка.
Замечание: процедура должна кончаться оператором RET.

Автор: bncom 16.2.2007, 20:29
Вот что пишется: user posted image

Автор: piritus 16.2.2007, 20:47
laba.asm в h:\tasm\bin\
в cmd пиши: 
cd \tasm\bin\
tasm.exe laba.asm
tlink.exe laba.obj /t

/t - создать файл типа COM

Автор: bncom 17.2.2007, 09:18
Все получилось, файл laba.com создался.
Но вот что мне с ним делать? Я его открываю обыкновенным способом - окошко сразу пропадает.
Через командную строку - тоже никакого результата.

Может файл с таким типом надо как-то по-другому открывать?

Вот полученные exe-файлы мы окрывали через Turbo Debagger... А тут что делать?

Автор: Ant 17.2.2007, 09:48
bncom, ну так и должно быть, ведь твоя программа ничего не выводит на экран, и ничего не просит ввести. Чего же ты от нее хочешь?

Автор: bncom 17.2.2007, 15:22
Ну а как результат-то ее действий посмотреть?

Автор: piritus 17.2.2007, 17:49
попробуй так:
laba.asm в h:\tasm\bin\
в cmd пиши: 
cd \tasm\bin\
tasm.exe laba.asm
tlink.exe laba.obj

(без параметра /t) должен быть .exe
если будет ругаться на отсутствие сегмента стека, то не обращай внимание

Автор: bncom 18.2.2007, 10:54
Спасибо, все получилось.

Тему можите закрывать.

Автор: Konstantinopol 21.2.2007, 11:15
1.Дан массив размерности n.Найти первый отрицательный элемент.
Вопрос:Сделать для двух отрицательных элементов?
#include <iostream>
using namespace std;
int main() {
    const int n = 10;
    int ar[n] = {4, 0, 2, 4, 3, 3, -5, 3, 7, 5};
    int r;
    asm {
       pusha
       push es
       push ds
       pop  es
       lea  edi, ar
       lea  esi, [edi + 4]
       xor  eax, eax
       mov  ecx, n
@4:    scasd
       jg   @5
       loop @4
       mov  r, -1
       jmp  @6
@5:    sub  edi, esi
       shr  edi, 2
       mov  r, edi
@6:    pop  es
       popa
    }
    (r < 0) ? cout<<"No negative elements" : cout<<ar[r];
    return 0;

 
2. В строке заменить все символы '1' символом '0', а символы '0' символом '1'
Вопрос: Шестым символом появляется '1' - помогите исправить?
 #include <iostream>
using namespace std;
int main() {
    char s[] = "234105431591045\0";
    char buf[30];
    asm {
       pusha
       push es
       push ds
       pop  es
       lea  esi, s
       lea  edi, buf
@1:    lodsb
       cmp  al, '0'
       jne  @2
       mov  al, '1'
       stosb
       jmp  @3
@2:    cmp  al, '1'
       jne  @3
       mov  al, '0'
@3:    stosb
       test al, al
       jne  @1
       pop  es
       popa
    }
    cout<<buf;
    return 0;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)