Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: HELP me ошибка при создании файла fatal command line can't locate file  (Прочитано 26153 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
hack
Интересующийся

ru
Offline Offline

« : 10-08-2017 05:19 » 

Приведу код  при создании объектного файла выплывает ошибка fatal command line can't locate file !
Что это значит?   Помогите разобраться

model small
.data
len equ 10
mas db 1,0,9,8,0,7,8,0,2,0
stack 100h
.code
start:
   mov ax, @data
   mov ds, ax
   mov cx, len
   xor ax, ax
   xor si, si
cycl:
   jcxz exit
   cmp mas[si], 0
   jne m1
   inc al
m1:
   inc si
   dec cx
   jmp cycl
   

   mov ax, 4c00h
   int 21h
   end start
Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #1 : 10-08-2017 05:47 » 

1) скорее всего Вы даёте транслятору(ассемблеру) не то имя файла - например, имя файла, в котором хранится код, который Вы привели, q.asm, а Вы транслятору даёте имя q1.asm.
2) у Вас в коде не хватает метки exit
Записан
RXL
Технический
Администратор

Online Online
Пол: Мужской

WWW
« Ответ #2 : 10-08-2017 07:25 » 

Код не имеет отношения к ошибке. Показывать надо было командную строку.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
hack
Интересующийся

ru
Offline Offline

« Ответ #3 : 10-08-2017 08:08 » 

привет!  Хочу вывести на экран массив что дополнить в коде чтобы экран не закрывался? exe формат программы

.model small
.stack 256
.data
mes db 0ah, 0dh, '0,1,3,5,8,9,3 ","$'
mas db 10 dup(?)
i db 0
.code
main:
   mov ax, @data
   mov ds, ax
   xor ax, ax
   mov cx, 10
   mov si, 0
go:
   mov bh, i
   mov mas[si], bh
   inc i
   inc si
   loop go

   mov cx, 10    ;вывод на экран массива
   mov si, 0
   mov ah, 09h
   lea dx, mes
   int 21h
show:
   mov ah, 02h
   mov dl, mas[si]
   add dl, 30h
   int 21h
   inc si
   loop show
exit:
   mov ax, 4c00h
   int 21h
end main
   

Добавлено через 11 минут и 55 секунд:
что сделать чтобы не закрывался экран ?

Добавлено через 2 минуты и 16 секунд:
вопрос решен ! тема закрыта!
« Последнее редактирование: 10-08-2017 08:10 от hack » Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 10-08-2017 09:47 » 

hack, обычно добавляют какое-то блокирующее действие - чаще всего, чтение 1 символа с клавиатуры, чтобы программа не завершалась до нажатия.
Можно просто сначала консоль открыть, а потом в уже открытой запустить программу.
Записан
Aether
Специалист

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 10-08-2017 20:43 » 

Можно просто сначала консоль открыть, а потом в уже открытой запустить программу.
Если запускать предполагается в Windows, то можно сделать *.bat файл вида:
Код:
@< Имя Вашей программы. >.exe
@pause
Записан
hack
Интересующийся

ru
Offline Offline

« Ответ #6 : 24-08-2017 14:35 » 

тасм ругается на строки 14 и 20 подкорректируйте пожалуйста
.model small
.stack 256
.data
a db 15
b db 70
c db 25
d db 35
f dw 0
.code
main:
xor ax, ax
mov al, 15
cbw
movsx bx, ax
sub ax, bx
imul c
idiv 2
xor dx, dx
mov dl, d
movsx ax, dx
add ax, dx
exit:
mov ax, 4c00h
int 21h
end main
Записан
Aether
Специалист

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 24-08-2017 16:37 » 

Продублирую:
Код: (ASM)
.model small

.stack 256

.data

a db 15
b db 70
c db 25
d db 35
f dw 0

.code

main:
    xor    ax, ax
    mov    al, 15
    cbw
    movsx  bx, ax
    sub    ax, bx
    imul   c
    idiv   2
    xor    dx, dx
    mov    dl, d
    movsx  ax, dx
    add    ax, dx

exit:
    mov    ax, 4c00h
    int    21h

end main

Итак, 14 и 20 строки это MOVSX - команда копирования с расширением и учётом знака, то есть, скорее всего, правильнее будет MOVSX ax, al. Пишу по памяти, и давно не пользовался знаковой арифметикой в ассемблере. И CBW вероятно вообще не нужен.

Уже запамятовал, в tasm нужно писать BYTE PTR для указания при записи количества информации? В NASM нужно писать просто BYTE?

Хотелось бы также видеть комментарии к коду, чтобы было легче ориентироваться и был понятен подход автора.
Записан
_KROL
Интересующийся

by
Offline Offline

« Ответ #8 : 24-08-2017 20:05 » new

Ну, на FASM так А черт его знает... :
Код: (ASM)
org 0x100
; xor ax, ax
 mov al, 15
 cbw
 movsx bx, al ; ax
 sub ax, bx
 imul [c]
 mov cl,2 ; idiv 2
 idiv cl  ;
 xor dx, dx
 mov dl, [d]
 movsx ax, dl ; dx
 add ax, dx
exit:
 mov ax, 4c00h
 int 21h

 a db 15
 b db 70
 c db 25
 d db 35
 f dw 0

Добавлено через 2 минуты и 1 секунду:
Если что(FASM): http://asmworld.ru/uchebnyj-kurs/012-preobrazovanie-tipov/

Добавлено через 9 минут и 25 секунд:
А ты видел какие в консоле ошибки?
**Error** P:\TMP\1.asm(17) Illegal instruction for currently selected processor(s)
**Error** P:\TMP\1.asm(24) Illegal instruction for currently selected processor(s)
Вот правильный код для TASM:
Код: (ASM)
.model small
.stack 256
.386 ; вот это и необходимо!

.data
 a db 15
 b db 70
 c db 25
 d db 35
 f dw 0

.code
main:
; xor ax, ax
 mov al, 15
 cbw
 movsx bx, al; ax
 sub ax, bx
 imul c
 mov cl,2 ; idiv 2
 idiv cl  ;
 xor dx, dx
 mov dl, d
 movsx ax, dl; dx
 add ax, dx
exit:
 mov ax, 4c00h
 int 21h
end main
« Последнее редактирование: 24-08-2017 20:16 от _KROL » Записан
Aether
Специалист

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 24-08-2017 20:57 » 

Я не компилировал.

Просто зачем нужно:
Код: (ASM)
    mov    al, 15
    cbw; Это лишняя.
    movsx  bx, ax; А это неправильная команда.
Если можно:
Код: (ASM)
    movsx  ax, BYTE PTR [a]; Вот тут синтаксис tasm не помню.

CBW, если правильно помню, расширяет al до ax, сохраняя знак.
MOVSX уже расширяет байт при копировании до слова, сохраняя знак.

Добавлено через 27 минут и 1 секунду:
Потренировался я:
Код: (ASM)
USE32

EXTERN _GetStdHandle@4
EXTERN _WriteConsoleA@20
EXTERN _ExitProcess@4

GLOBAL _start

SECTION .text
start:

    call      setup_console

    mov       eax, title_1
    call      print

; f = (a + b) * (c + d)
; Без проверок!

;a = -15
;b = 70
;c = -25
;d = 35
;f = (-15 + 70) * (-25 + 35) = 55 * 10 = 550 - это должно получиться.

    movsx     ax, BYTE [a]
    movsx     bx, BYTE [b]
    add       ax, bx
    push      ax
    movsx     ax, BYTE [c]
    movsx     bx, BYTE [d]
    add       ax, bx
    pop       bx
    imul      bx
    mov       WORD [f], ax
    cwde
    call      print_num

    mov       eax, title_2
    call      print

push          DWORD 0
call          _ExitProcess@4

; Функция настройки stdout для вывода в консоль.
; ВХОД: без параметров.
; ВЫХОД: записывает значение stdout в глобальную переменную stdout.
; РЕГИСТРЫ: не изменяются.
setup_console:

    push      eax
    push      DWORD -11
    call      _GetStdHandle@4
    mov       [stdout], eax
    pop       eax
    ret

; Функция определения длины строки по завершающему нулю.
; ВХОД: eax - указатель на исследуемую строку.
; ВЫХОД: записывает длину строки в глобальную переменную length.
; РЕГИСТРЫ: не изменяются.
strlen:

    push      eax
    push      esi
    push      edi
    mov       esi, eax
    xor       edi, edi
strlen_loop:
    mov       al, BYTE [esi]
    test      al, al
    jz        strlen_exit
    inc       esi
    inc       edi
    jmp       strlen_loop
strlen_exit:
    mov       DWORD [length], edi
    pop       edi
    pop       esi
    pop       eax
    ret

; Функция выводит строку с завершающим нулём в консоль.
; ВХОД: eax - указатель на строку.
; ВЫХОД: без результатов.
; РЕГИСТРЫ: не изменяются.
print:

    call      strlen

    push      ecx
    push      DWORD 0
    push      DWORD written
    push      DWORD [length]
    push      eax
    push      DWORD [stdout]
    call      _WriteConsoleA@20
    pop       ecx
    ret

; Функция выводит цифру в консоль.
; ВХОД: edx - значение выводимой цифры.
; ВЫХОД: без результатов.
; РЕГИСТРЫ: не изменяются.
print_digit:

    push      eax
    push      ecx
    mov       eax, DWORD line
    add       eax, edx
    push      DWORD 0
    push      DWORD written
    push      DWORD 1
    push      eax
    push      DWORD [stdout]
    call      _WriteConsoleA@20
    pop       ecx
    pop       eax
    ret

; Функция выводит число со знаком в консоль.
; ВХОД: eax - значение числа со знаком.
; ВЫХОД: без результатов.
; РЕГИСТРЫ: не изменяются.
print_num:

    push      eax
    push      ebx
    push      ecx
    push      edx
    xor       ecx, ecx
    mov       ebx, 10
    test      eax, 0x80000000
    jz        print_num_plus
    push      eax
    mov       eax, DWORD minus
    call      print
    pop       eax
    neg       eax
print_num_plus:
    xor       edx, edx
    div       ebx
    push      edx
    inc       ecx
    cmp       eax, 10
    jnc       print_num_plus
    mov       edx, eax
    call      print_digit
    cmp       ecx, 1
    jnz       print_num_loop
    pop       edx
    jmp       print_num_exit
print_num_loop:
    pop       edx
    call      print_digit
    loop      print_num_loop
print_num_exit:
    mov       eax, DWORD line_end
    call      print
    pop       edx
    pop       ecx
    pop       ebx
    pop       eax
    ret    

SECTION .data

a DB -15
b DB 70
c DB -25
d DB 35
f DB 0

title_1 DB "Start.", 0x0A, 0x0D, 0
title_2 DB "Finish.", 0x0A, 0x0D, 0

stdout DD 0
length DD 0
written DD 0
minus DB "- ", 0
line DB "0123456789ABCDEF"
line_end DB 0x0A, 0x0D, 0
Start.
550
Finish.
Для продолжения нажмите любую клавишу . . .
Может где и накосячил, так как бегло набрал.
« Последнее редактирование: 24-08-2017 21:26 от Aether » Записан
hack
Интересующийся

ru
Offline Offline

« Ответ #10 : 25-08-2017 05:11 » 

Здравствуйте! см здесь ошибка файл не может найти  см здесь http://prntscr.com/gcry9z
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines