Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Assembler

Автор: Zeus2090
Дата сообщения: 18.12.2008 13:53
akaGM
Я понял. просто говорю спасибо за время потраченное на меня. ))
Автор: akaGM
Дата сообщения: 18.12.2008 14:05
Zeus2090
фигня...
если что по ходу -- спрашивай...
а на кого и где ты учишься, если такие курсовики там летают?
Автор: Zeus2090
Дата сообщения: 18.12.2008 17:29
S
Автор: serj_nsk
Дата сообщения: 21.12.2008 12:25
Помогите вставить в эту базу данных сортировку по любому из атрибутов
до вторника желательно!! оч буду признателен

text segment 'code'
     assume cs:text, ds:data
stdout=1
stdin=0
CR=13
LF=10

myproc proc
mov AX, data
mov DS, AX
mov si,0

;устанавливаем цвет фона и символов
mov ah,06h
mov al,0
mov bh,20h
mov ch,0
mov cl,0
mov dh,24
mov dl,79
int 10h

mov ah,06h
mov al,0
mov bh,30h
mov ch,7
mov cl,0
mov dh,24
mov dl,79
int 10h

;вывод меню
mov ah,40h
mov bx,stdout
mov cx,fonlen
mov dx,offset fon
int 21h

mov ah,40h
mov bx,stdout
mov cx,menulen
mov dx,offset menu
int 21h

;открытие файла
mov AH, 3dh
mov al,2
mov CX, 0
mov DX, offset filename
int 21h
mov handle, AX

nn:
mov ah,01
int 21h
;Выбор пункта меню нажатием соответствущей клавиши.
;При нажатии 1-5 переход на соответствующую метку
cmp al,'1'
je cc
cmp al,'2'
je vvod
cmp al,'3'
je vivod
cmp al,'4'
je vv
cmp al,'5'
je exit1
call error

cc:
;создание файла
mov ah,06h
mov al,0
mov bh,30h
mov ch,7
mov cl,0
mov dh,24
mov dl,79
int 10h

mov ah,02h
mov bh,0
mov dh,6
mov dl,0
int 10h

mov AH, 3ch
mov CX, 0
mov DX, offset filename
int 21h
mov handle, AX

next:
call continuec
;вывод сообщения об ошибке, если нажата клавиша не из диапазона 1-5
error:
mov ah,06h
mov al,0
mov bh,30h
mov ch,7
mov cl,0
mov dh,24
mov dl,79
int 10h

mov ah,02h
mov bh,0
mov dh,6
mov dl,0
int 10h

;Вывод сообщения об ошибке
mov ah,40h
mov bx,stdout
mov cx,erlen
mov dx,offset er
int 21h

call continuec

vivod:
call vivod1
vv:
call vv1
exit1:
call exit

;добавление новой строки в конец файла
vvod:
mov ah,06h
mov al,0
mov bh,30h
mov ch,7
mov cl,0
mov dh,24
mov dl,79
int 10h

mov ah,02h
mov bh,0
mov dh,6
mov dl,0
int 10h

;смещаем указатель на конец файла
mov ah,42h
mov al,2
mov bx,handle
mov cx,0
mov dx,0
int 21h

mov ah,40h
mov bx,stdout
mov cx,lennum
mov dx,offset nummes
int 21h

mov ah,3Fh
mov bx,stdin
mov cx,500
mov dx,offset buf1
int 21h
sub ax,2
mov actlen1,ax

;дописывание нулей в начало если длина номера меньше 3
mov cx,3
sub cx,ax
cmp cx,0
je next5
cicl4:
push cx
mov ah,40h
mov bx,handle
mov cx,1
mov dx,offset nul
int 21h
pop cx
loop cicl4

next5:

;Вывод номера строки на экран
mov ah,40h
mov bx,handle
mov cx,actlen1
mov dx,offset buf1
int 21h

;Вставка пробела
mov ah,40h
mov bx,handle
mov cx,1
mov dx,offset pr
int 21h

;Введения названия театра
mov ah,40h
mov bx,stdout
mov cx,namelen
mov dx,offset namep
int 21h

;ввод новой строки с клавиатуры
mov ah,3Fh
mov bx,stdin
mov cx,500
mov dx,offset buf
int 21h
sub ax,2
mov actlen,ax

;записываем строку в файл без 2-х последних символов перехода на новую строчку
mov ah,40h
mov bx,handle
mov cx,actlen
mov dx,offset buf
int 21h

;дополняем строку пробелами, чтобы длина записи была равна 80
mov cx,21
sub cx,actlen
sub cx,2
cicl1:
mov ah,40h
mov bx,handle
push cx
mov cx,1
mov dx,offset pr
int 21h
pop cx
loop cicl1

;Введение даты создания театра
mov ah,40h
mov bx,stdout
mov cx,datalen
mov dx,offset datap
int 21h

;ввод новой строки с клавиатуры
mov ah,3Fh
mov bx,stdin
mov cx,500
mov dx,offset buf
int 21h
sub ax,2
mov actlen,ax

;записываем строку в файл без 2-х последних символов перехода на новую строчку
mov ah,40h
mov bx,handle
mov cx,actlen
mov dx,offset buf
int 21h

;дополняем строку пробелами, чтобы длина записи была равна 21
mov cx,21
sub cx,actlen
sub cx,2
cicl11:
mov ah,40h
mov bx,handle
push cx
mov cx,1
mov dx,offset pr
int 21h
pop cx
loop cicl11

;Введение имени города
mov ah,40h
mov bx,stdout
mov cx,gorodlen
mov dx,offset gorod
int 21h

;ввод новой строки с клавиатуры
mov ah,3Fh
mov bx,stdin
mov cx,500
mov dx,offset buf
int 21h
sub ax,2
mov actlen,ax

;записываем строку в файл без 2-х последних символов перехода на новую строчку
mov ah,40h
mov bx,handle
mov cx,actlen
mov dx,offset buf
int 21h

;дополняем строку пробелами, чтобы длина записи была равна 20
mov cx,20
sub cx,actlen
sub cx,2
cicl12:
mov ah,40h
mov bx,handle
push cx
mov cx,1
mov dx,offset pr
int 21h
pop cx
loop cicl12

;Введение имени режиссера
mov ah,40h
mov bx,stdout
mov cx,rejlen
mov dx,offset rej
int 21h

;ввод новой строки с клавиатуры
mov ah,3Fh
mov bx,stdin
mov cx,500
mov dx,offset buf
int 21h
sub ax,2
mov actlen,ax

;записываем строку в файл без 2-х последних символов перехода на новую строчку
mov ah,40h
mov bx,handle
mov cx,actlen
mov dx,offset buf
int 21h

;дополняем строку пробелами, чтобы длина записи была равна 20
mov cx,20
sub cx,actlen
sub cx,2
cicl13:
mov ah,40h
mov bx,handle
push cx
mov cx,1
mov dx,offset pr
int 21h
pop cx
loop cicl13

;добавление символа перевода на следующую строку
mov ah,40h
mov bx,handle
mov cx,2
mov dx,offset en
int 21h

call continuec
;вывод всего содержимого файла
vivod1:

;очистка экрана
mov ah,06h
mov al,0
mov bh,30h
mov ch,7
mov cl,0
mov dh,24
mov dl,79
int 10h

;позиционирование курсора
mov ah,02h
mov bh,0
mov dh,6
mov dl,0
int 10h

mov ah,40h
mov bx,stdout
mov cx,2
mov dx,offset en
int 21h

;перевод указателя на начало файла
mov ah,42h
mov al,0
mov bx,handle
mov cx,0
mov dx,0
int 21h

;Считывание в buf содержимого файла
mov ah,3Fh
mov bx,handle
mov cx,1500
mov dx,offset buf2
int 21h
mov actlen2,ax

;Вывод buf на экран
mov ah,40h
mov bx,stdout
mov cx,actlen2
mov dx,offset buf2
int 21h

call continuec

;удаление строки
vv1:
mov ah,40h
mov bx,stdout
mov cx,delslen
mov dx,offset dels
int 21h

;Ввод номера удаляемой строки
mov ah,3fh
mov bx,stdin
mov cx,80
mov dx,offset buf3
int 21h

;Создание вспомогательного файла
mov AH, 3ch
mov CX, 0
mov DX, offset filename1
int 21h
mov handle1, AX

;Цикл сравнения строк в файле с удаляемой
mov cx,30
mov di,0

cicl2:
;Сохраняем значение cx
mov n,cx

;Смещение указателя на размер 1 записи(80)
mov ah,42h
mov al,0
mov bx,handle
mov cx,0
mov dx,di
int 21h

;Считывание файла
mov ah,3fh
mov bx,handle
mov cx,80
mov dx,offset buf1
int 21h
mov actlen1,ax
add di,80

;Сравнение номера строк в цикле по 1 символу
mov si,0
mov cx,3
cicl3:
mov bh,buf3[si]
mov bl,buf1[si]
cmp bh,bl
jne next3
inc si
loop cicl3

;Если символы не совпадают то переходим на метку, не выводя строку во вспомагательный файл
call next2
next3:

;Вывод строки во вспомагательный файл
mov ah,40h
mov bx,handle1
mov cx,actlen1
mov dx,offset buf1
int 21h

next2:

;Восстановления количества повторений в цикле
mov cx,n
loop cicl2

;Закрытие исходного файла
mov ah,3eh
mov bx,handle
int 21h

;Закрытие вспомагательного файла
mov ah,3eh
mov bx,handle1
int 21h

;Удаление исходного файла
mov AH, 41h
mov CX, 0
mov DX, offset filename
int 21h

;Замена основного файла вспомагательным
push ds
pop es
mov ah,56h
mov dx,offset filename1
mov di,offset filename
int 21h

;Открытие основного файла
mov AH, 3dh
mov al,2
mov CX, 0
mov DX, offset filename
int 21h
mov handle, AX

;Закрашивание области на экране и изменения цвета символов
mov ah,06h
mov al,0
mov bh,30h
mov ch,7
mov cl,0
mov dh,24
mov dl,79
int 10h

;Позиционирования курсора
mov ah,02h
mov bh,0
mov dh,6
mov dl,0
int 10h


continuec:
mov ah,40h
mov bx,stdout
mov cx,2
mov dx,offset en
int 21h

jmp nn

exit:
;закрытие файла
mov ah,3eh
mov bx,handle
int 21h
;выход из программы
mov AX, 4C00h
int 21h
myproc endp

text ends

data segment
n dw 0
buf db 2000 dup (0)
actlen dw 0
buf1 db 2000 dup (0)
actlen1 dw 0
buf2 db 2000 dup (0)
actlen2 dw 0
buf3 db 2000 dup (0)
actlen3 dw 0
nul db '0'
fon db 'Teatri Rossii',CR,LF
fonlen equ $-fon
nummes db CR,LF,'Vvedite nomer stroki:',CR,LF
lennum equ $-nummes
menu db '1.Sozdat new fail',CR,LF,'2.Vstavit stroku',CR,LF,'3.Vivesti dannie na ekran',CR,LF,'4.Udalit stroku',CR,LF,'5.Exit',CR,LF,'Viberite menu, najav klavishi 1-5:',CR,LF
menulen equ $-menu
er db CR,LF,'Oshibka vvoda. Povtorite popitku:',CR,LF
erlen equ $-er
namep db CR,LF,'Vvedite nazvanie teatra:',CR,LF
namelen equ $-namep
datap db CR,LF,'Vvedite datu sozdaniya:',CR,LF
datalen equ $-datap
gorod db CR,LF,'Vvedite gorod:',CR,LF
gorodlen equ $-gorod
rej db CR,LF,'Vvedite imya glavnogo rejissera:',CR,LF
rejlen equ $-rej
en db CR,LF
namen db ?
dels db CR,LF,'Vvedite nomer stroki, dlya udaleniya',CR,LF
delslen equ $-dels
handle dw ?
handle1 dw ?
filename db 'teatri.txt',0
filename1 db 'teatri.in',0
pr db ' '
mas dw 100 dup(0)
data ends

stack1 segment para stack 'stack'
    db 128 dup (?)
stack1 ends
end myproc
Автор: Meradone
Дата сообщения: 21.12.2008 13:55
хех может кто-нибудь поможет с алгоритмом вычисления обратной матрицы??? Нужен только сам процесс преобразования.

Добавлено:
Или такой вопрос... Дето тут вроде читал пишут что можно с Си на асм перегнать прогу...
Возможно ли это или нет???????????????
Автор: serqei35
Дата сообщения: 21.12.2008 17:07
всем привет! Есликого книги по программированию интересуют, скачать можно здесь:
http://webprogrammer.wallst.ru/programming.html
Автор: Santilos
Дата сообщения: 23.12.2008 19:12
Народ, помогите решить задачу: требуется вывести из сегмента стека заданное количество байт в шестнадцатеричном виде. Я в ассемблере лошара полный. Подправьте, пожалуйста, код. Вот мой кривой исходник

.model small
.stack 100h
.data
text db 'vvedite colitchestvo bait'
.code
    mov ax,@data
    mov ds,ax
    mov dx, offset text
mov ah, 9h
int 21h
mov ah, 8h                
    int 21h                    
cmp al, 0dh                
    jne f1        
    mov si,0 ;установка значения 0 в инд рег
f1:    mov dl,ss:[si] ;помещаем первый байт сегмента кода в рег dl


    mov bl,dl ;поместить значение рег dl
    mov cx,2 ;установка рег сх значение 2
    push bx ;положить значение рег bx в стек
    
    shr bl,4 ;сдвиг рег bx на 4 рзряда
srav:
    cmp bl,9 ;сравнить рег bl c 9
    jle cifra ;если меньше то переход на метку
    add bl,37h ; ИНАЧЕ прибавить 55
    mov ah,2 ;поместить в рег ah счисло 2
    mov dl,bl ;поместить в рег
    int 21h ;вызов 21 прерывания
    jmp two ;переход на метку
cifra:
    add bl,30h ;прибавить к рег bl 48
    mov ah,2 ;поместить в рег ah число 2
    mov dl,bl ;поместить в рег dl значение рег bl
    int 21h ;вызов 21 прерывания

two:
    pop bx ;взять значение из стека и поместить в рег bx
    and bl,0fh ; обнуление 4 битов рег bl
    loop srav ;переход по метке
    inc si ;увеличить si на 1
    
    cmp si,15 ;сравнить рег si c 15
jne f1      ; если меньше или равно переход на метку

mov ah,08h ;ожидание нажатия клавиши
int 21h
    mov ah,4ch ;завершение программы
    int 21h
end ;конец
Автор: amnick
Дата сообщения: 30.12.2008 18:56

Цитата:
Дето тут вроде читал пишут что можно с Си на асм перегнать прогу...
Возможно ли это или нет???????????????

Если используется Visual Studio, то в настройках компилятора поставьте генерацию ассемблерного листинга - будет вам "перегон с Си на асм". В общем случае - компилируете и дизассемблируете или смотрите в отладчике дизассемблированный код.
Автор: xNecrosx
Дата сообщения: 02.01.2009 02:29
Есть прога(текст ниже)...Она издает гудок при нажатии каждой 2 кропки,необходимо чтобы при нажатии каждой 2 клавиши она издавала щелчек.Подскажите где подправить и что
[more].386
.model flat, stdcall
option casemap:none
;подключаемые модули
include c:\masm32\include\windows.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc
include c:\masm32\include\gdi32.inc
;подключаемые библиотеки
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
includelib c:\masm32\lib\gdi32.lib
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
;Инициализация переменных
.data
szDisplayName DB "Курсовая СПО Иванюк Дмитрий Иванович",0
CommandLine DD 0
hWnd DD 0
hInstance DD 0
szClassName DB "Demo_Class", 0
sTitle DB "Введите символ", 0
sMsg DB "Вы ввели вторую букву : "
cll DB ?, 0 ;переменная хранящая введенный символ
koll DB 0
.code
start:
push NULL
call GetModuleHandle
mov hInstance, EAX
call GetCommandLine
mov CommandLine, EAX
push SW_SHOWDEFAULT
push CommandLine
push NULL
push hInstance
call WinMain
push EAX
call ExitProcess
WinMain proc hInst :DWORD,
hPrevInst :DWORD,
CmdLine :DWORD,
CmdShow :DWORD

;локальные переменные процедуры

LOCAL wc :WNDCLASSEX
LOCAL msg :MSG

;инициализация окна

mov wc.cbSize, sizeof WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, offset WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
push hInst
pop wc.hInstance
mov wc.hbrBackground, COLOR_BTNFACE+9
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, offset szClassName
invoke LoadIcon, NULL, IDI_APPLICATION
mov wc.hIcon, EAX
invoke LoadCursor, NULL, IDC_ARROW
mov wc.hCursor, EAX
mov wc.hIconSm, 0
invoke RegisterClassEx, ADDR wc
invoke CreateWindowEx, WS_EX_OVERLAPPEDWINDOW, ADDR szClassName, \
ADDR szDisplayName, WS_OVERLAPPEDWINDOW, \
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, \
CW_USEDEFAULT, NULL, NULL, hInst, NULL
mov hWnd, EAX
invoke ShowWindow, hWnd, SW_SHOWNORMAL
invoke UpdateWindow, hWnd

;______________________

StartLoop:
push 0
push 0
push NULL
lea EAX, msg
push EAX
call GetMessage
cmp EAX, 0
je ExitLoop
lea EAX, msg
push EAX
call TranslateMessage
lea EAX, msg
push EAX
call DispatchMessage
jmp StartLoop
ExitLoop:
mov EAX,msg.wParam
ret
WinMain endp

;_____________________

WndProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD,

LOCAL hdc :HDC
LOCAL ps :PAINTSTRUCT
cmp uMsg, WM_PAINT
jne next_1
invoke BeginPaint, hWnd, ADDR ps
mov hdc, EAX
lea EDX, ps
push EDX
push hWnd
call EndPaint
ret

;получение и обработка клавиш

next_1:
cmp uMsg, WM_CHAR
jne next_2
mov EAX,wParam
mov cll, AL

;возврат данных для окна

;проверка какая по счету буква

cmp koll, 0
jz next_12

cmp koll, 1
jz next_11

next_11:

mov koll, 0
jmp next_13

next_12:
mov koll, 1
jmp next_2

next_13:

push MB_OK
push offset sTitle
push offset sMsg
push 0
call MessageBeep ;возпроизводит звук если messagebox то выводит окно
ret

;вывод и закрытие окна по сигналу

next_2:

cmp uMsg, WM_DESTROY
jne next_3
push NULL
call PostQuitMessage
xor EAX, EAX
ret

next_3:

push lParam
push wParam
push uMsg
push hWin
call DefWindowProc
ret

WndProc endp

end start[/more]
Автор: eGorZ
Дата сообщения: 02.01.2009 02:57
Santilos, xNecrosx
листинги прячем под тегом more, пример ниже - нажмите "Редактировать" в моём посте для просмотра
[more=это твой листинг]

Код:
.386
.model flat, stdcall
option casemap:none
;подключаемые модули
include c:\masm32\include\windows.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc
include c:\masm32\include\gdi32.inc
;подключаемые библиотеки
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
includelib c:\masm32\lib\gdi32.lib
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
;Инициализация переменных
.data
szDisplayName DB "Курсовая СПО Иванюк Дмитрий Иванович",0
CommandLine DD 0
hWnd DD 0
hInstance DD 0
szClassName DB "Demo_Class", 0
sTitle DB "Введите символ", 0
sMsg DB "Вы ввели вторую букву : "
cll DB ?, 0 ;переменная хранящая введенный символ
koll DB 0
.code
start:
push NULL
call GetModuleHandle
mov hInstance, EAX
call GetCommandLine
mov CommandLine, EAX
push SW_SHOWDEFAULT
push CommandLine
push NULL
push hInstance
call WinMain
push EAX
call ExitProcess
WinMain proc hInst :DWORD,
hPrevInst :DWORD,
CmdLine :DWORD,
CmdShow :DWORD

;локальные переменные процедуры

LOCAL wc :WNDCLASSEX
LOCAL msg :MSG

;инициализация окна

mov wc.cbSize, sizeof WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, offset WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
push hInst
pop wc.hInstance
mov wc.hbrBackground, COLOR_BTNFACE+9
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, offset szClassName
invoke LoadIcon, NULL, IDI_APPLICATION
mov wc.hIcon, EAX
invoke LoadCursor, NULL, IDC_ARROW
mov wc.hCursor, EAX
mov wc.hIconSm, 0
invoke RegisterClassEx, ADDR wc
invoke CreateWindowEx, WS_EX_OVERLAPPEDWINDOW, ADDR szClassName, \
ADDR szDisplayName, WS_OVERLAPPEDWINDOW, \
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, \
CW_USEDEFAULT, NULL, NULL, hInst, NULL
mov hWnd, EAX
invoke ShowWindow, hWnd, SW_SHOWNORMAL
invoke UpdateWindow, hWnd

;______________________

StartLoop:
push 0
push 0
push NULL
lea EAX, msg
push EAX
call GetMessage
cmp EAX, 0
je ExitLoop
lea EAX, msg
push EAX
call TranslateMessage
lea EAX, msg
push EAX
call DispatchMessage
jmp StartLoop
ExitLoop:
mov EAX,msg.wParam
ret
WinMain endp

;_____________________

WndProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD,

LOCAL hdc :HDC
LOCAL ps :PAINTSTRUCT
cmp uMsg, WM_PAINT
jne next_1
invoke BeginPaint, hWnd, ADDR ps
mov hdc, EAX
lea EDX, ps
push EDX
push hWnd
call EndPaint
ret

;получение и обработка клавиш

next_1:
cmp uMsg, WM_CHAR
jne next_2
mov EAX,wParam
mov cll, AL

;возврат данных для окна

;проверка какая по счету буква

cmp koll, 0
jz next_12

cmp koll, 1
jz next_11

next_11:

mov koll, 0
jmp next_13

next_12:
mov koll, 1
jmp next_2

next_13:

push MB_OK
push offset sTitle
push offset sMsg
push 0
call MessageBeep ;возпроизводит звук если messagebox то выводит окно
ret

;вывод и закрытие окна по сигналу

next_2:

cmp uMsg, WM_DESTROY
jne next_3
push NULL
call PostQuitMessage
xor EAX, EAX
ret

next_3:

push lParam
push wParam
push uMsg
push hWin
call DefWindowProc
ret

WndProc endp

end start
Автор: gloom
Дата сообщения: 02.01.2009 04:07

Цитата:
Есть прога(текст ниже)...Она издает гудок при нажатии каждой 2 кропки,необходимо чтобы при нажатии каждой 2 клавиши она издавала щелчек.Подскажите где подправить и что

Во-первых найди звук щелчка, т.к. его нет в стандартных звуках и кинь рядом с исходником (обзови напимер sound.wav).
Создай файл rsrc.rc и положи его там же.
Напиши в нем:
SWave        WAVE        sound.wav

Добавь в своем исходнике к подключаемым библиотекам строку:
includelib c:\masm32\lib\winmm.lib
А к инициализации переменных:
WaveS db "SWave",0

Затем вместо:

Код:
push MB_OK
push offset sTitle
push offset sMsg
push 0
call MessageBeep ;возпроизводит звук если messagebox то выводит окно
Автор: student09
Дата сообщения: 07.01.2009 20:12
Уважаемые гуру ассемблера, помогите студенту нубу пожалуйста, дали задачку, а сам полный лох в этом
Пользователь вводит два числа А и В в десятичном виде через процедуру, осуществляя передачу результата ввода через стек. Программа должна:
1. Посчитать С=А/2+В. Выполнить арифметический сдвиг С на 3 бит влево. Расчет должен быть выполнен с использованием макроопределения.
2. Вывести на экран число С и все промежуточные числа в двоичном виде, с использованием макроопределения.

и с Рождеством всех!
Автор: dave101ua1111
Дата сообщения: 08.01.2009 18:05
Такой вопрос,
есть код

    mov ah,02h
mov dl,count[si]
    int 21h

если в count[si] ниходится цифра от 0 до 9 то нормально выводит на экран, а если больше 9 то выводит непонятно что, какой то ascii символ. получается ф-я 02h работает только с цифрами, а как вывести число тогда ?
преобразовать число в строку и выводить ее через 09h ? если да то как преобразовывать ?
Автор: SERGE_BLIZNUK
Дата сообщения: 09.01.2009 12:00
dave101ua1111
проверяйте, похоже что у Вас в count[si] какие-то непечатные коды < 20h
[more=пример...]
Код: [no]

.model small
.code
main proc
mov ah,02h
mov dl,'9'
int 21h
mov dl,'A'
int 21h
mov dl,':'
int 21h
mov dl,'z'
int 21h

mov ax, 4c00h
int 21h

main endp
end main
[/no]
Автор: dave101ua1111
Дата сообщения: 09.01.2009 18:03
SERGE_BLIZNUK,

похоже что в count[si] то что должно быть, но не то что нужно мне.
программа делает следующее,
вводим строку символов, а она выводит какой символь сколько раз в строке встречается.
листинг:
[more]
.MODEL    TINY
.386
STACK 256    
DATASEG
; symbols 13 and 32, carriage return and space symbol, start count from 0
;msg db 0ah, 0dh, 'Enter string: $'
msg db 'Enter string:$'
;string db 254,0
;times 253 db dup(' ') ;заполняем буфер строки пробелами
string db 256 DUP ('#')
count db 256 DUP ('0') ;массив с количествами символов
;string db 255,0, 256 dup (' ')
new db 0ah, 0dh, '$'
i db 0
arrow db '->$'


CODESEG        
start:    
    mov ax,@data
    mov ds,ax
    mov ah,09h
    mov dx,offset msg
    int 21h

    mov ah, 0Ah
    mov dx,offset string
    int 21h

    xor ax,ax
    mov al,offset string+1
    inc dx
    add dx, ax
    mov si,dx
    

    mov ah,09h
    mov dx,offset new ;output new line symbol
    int 21h


    std ;устанавливаем флаг направления дляпрохода обратно
    print_next_char:
    lodsb ;читаем символ из DS:SI и уменьшаем SI на 1

    cmp si,offset string+1 ;конец строки? (то есть начало)
    jb endprog ; если да, то переход к концу программы


     cmp al,0dh
     je skip
     cmp al,023h
     je skip

     movzx bx,al
dec bx
    
     inc byte[bx+count]
skip:
    mov dl, al ;загружаем прочитанный из строки символ в DL
    mov ah,02h ;DOS-функция вывода символа
;    int 21h ;вызов DOS
    jmp print_next_char ;возвращаемся к следующему символу
endprog:
mov dx,offset new
    mov ah,09h
    int 21h


mov dx,offset count
    mov ah,09h
    ;int 21h ;displays count array

;my data block


    mov cx,256 ;set counter
    mov si,0
    mov i,0
show:
    cmp count[si],30h
    je next

    mov ah,02h
    mov dl,i
    int 21h ;output letter


    
    mov ah,09h
    mov dx,offset arrow;display ->
    int 21h


    mov ah,02h
mov dl,count[si]
;    mov ah,09h
; mov dx,count[si]

    int 21h

    mov ah,09h
    mov dx,offset new ;display newline
    int 21h


next:
    inc si
    inc i

    loop show


;end my data block
    mov ah,04Ch
    mov al,1h
    int 21h

end start
[/more]

изначально массив заполнен нулями
count db 256 DUP ('0')
потом в цикле я беру каждый символ строки и увеличиваю значение нужного элемента массива на 1 :

Код:
    lodsb ;читаем символ из DS:SI и уменьшаем SI на 1

...
     movzx bx,al
dec bx
    
     inc byte[bx+count]

Автор: SERGE_BLIZNUK
Дата сообщения: 10.01.2009 02:46
dave101ua1111

1) измените задание исходного массива (не символ '0' - а просто ноль):
count db 256 DUP (0) ;массив с количествами символов

2) код между выдачей стрелки (arrow) и переводом на новую строку замените на код:


Код:
push si
push cx
mov ah, 0h
mov al,count[si]
mov bl,10 ; Divisor
mov cx,sp ; Remember stack location

NextDigit:
div bl ; Divide, result stays in AL, remainder in AH
mov si,ax ; save AX

add ah,'0'
mov dl,ah

push dx ; push one DIGIT to STACK

mov ax,si ; restore AX
mov ah,0h
test ax,ax ; Any more digits?
jnz NextDigit

showNumber:
pop dx
mov ah,02h
int 21h
cmp cx,sp
jne showNumber

pop cx
pop si
Автор: eLENfOR
Дата сообщения: 12.01.2009 18:07
Здраствуйте, помогите пожалуйста решить эту наисложнейшие задачки:
1) Организовать ввод строки символов.Из текста удалить слова,содержащие три буквы "о" .Результат вывести на экран;
2) Написать пр-му вывода строки с заданной позиции на экране по N символов в экранной строке :row-номер строки,col- номер столбца, N-кол-во символов в одной экранной строке
Автор: plasmoid
Дата сообщения: 15.01.2009 22:24
Помогите плиз написать программу, которая будет рекурсивно выводить содержимое всех попок диска, на котором находится.
Заранее спасибо всем откликнувшимся
Автор: crow134
Дата сообщения: 19.01.2009 02:40
здраствуйте, помогите решить задачу на ассемблере. постановка такая, что при помощи c# передается название тестового файла, в котором написаны названия других текстовых файлов, в которых нужно производить какие-либо изменения, например заменить букву a на b. с частью на c# справился, но не могу додуматься, как заставить ассм открывать и сохранять изменения в текстовых файлах. буду очень признателен даже за подсказку, в каком направлении двигаться.
Автор: SERGE_BLIZNUK
Дата сообщения: 19.01.2009 07:52
crow134
тут, есть принципиальный момент...
для начала определитесь, под какую платформу Ассемблер будете делать...
если под DOS - тогда двигайтесь в направлении функций MS DOS (21 прерывание)
если под Windows - изучайте WinApi.
Автор: TerrraN
Дата сообщения: 20.01.2009 12:52
Доброго времени суток.
Просьба помочь с вот такой вот задачкой.
Программа должна выводить первый 10 байт из своего PSP + защита паролем и кол-вом запусков.
С защитами то разобрался, а вот как эти 10 байт взять не знаю.
Заранее спасибо.
Автор: crow134
Дата сообщения: 20.01.2009 15:36
SERGE_BLIZNUK
спасибо
Автор: dave101ua1111
Дата сообщения: 30.01.2009 19:23
SERGE_BLIZNUK,
спасибо за помощь !
сорри за поздний ответ!
Автор: Argogo
Дата сообщения: 08.02.2009 13:31
TerrraN
Для DOS-программ сегментный адрес PSP находится в DS и ES сразу при получении управления от ОСи.
Автор: ferya
Дата сообщения: 09.02.2009 20:49
Помогите пожалуста с задачей)

Логические операции Составьте программу и продемонстрируйте её работу
Используя свойство реверсивности команды XOR, напишите программу «шифрования» вводимой с клавиатуры строки и последующей её расшифровки.
Кодировку и раскодировку осуществлять с помощью «ключа» Key- двоичного кода, задающего инверсию битов исходных символов. Например, ключ Key= 00100101bдолжен инвертировать в каждом символе биты 5, 2 и 0 .
Исходный символ и ключ ввести с клавиатуры. Отобразить коды исходного, «закодированного» и «раскодированного» символов на экране.

Заранее спасибо)
Автор: xellga
Дата сообщения: 13.02.2009 12:04
Как с помощью безусловного перехода jmp изменить пограмму чтоб она обрабатывалась 1 раз.
программа такая :
.model tiny
.code
.386
org 100h
start:
mov eax,20
mov ebx,8
push eax
push ebx
call my_subroutin
pop ebx
pop eax
my_subroutin proc near
mov eax,a
mov ebx,2
mul ebx
mov flag,eax
mov ebx,4
mov eax,b
mul ebx
add eax,flag
add eax,b
add eax,c
mov ebx,-1
mul ebx
and eax,1111111110000011b
or eax, 0000000001100011b
ret
a dd -6
b dd -4
c dd -16
flag dd ?
my_subroutin endp
end start
Автор: virpool
Дата сообщения: 15.02.2009 08:44
xellga
вообще-то вроде если писать под windows то в конце нужно
mov eax, 0
push eax
call ExitProcess

под дос:
mov ah, 4ch
int 21h
Автор: airlynx
Дата сообщения: 26.02.2009 13:56

Цитата:
вообще-то вроде если писать под windows то в конце нужно
mov eax, 0
push eax
call ExitProcess

Быстрее всего написать retn. Так и на 1 api меньше импортировать.
Автор: akaGM
Дата сообщения: 26.02.2009 15:16
да нормально у него(у неё) всё написано, нормальный COM...

xellga
а что такое "обрабатывалась один раз"?
один запуск -- одно исполнение...
Автор: akaGM
Дата сообщения: 26.02.2009 20:42
а, наверное, вот что имелось ввиду:

Код: .model tiny
.code
.386
org 100h
start:
mov eax,20
mov ebx,8
push eax
push ebx
call my_subroutin
pop ebx
pop eax
jmp @@end:
my_subroutin proc near
[...]
my_subroutin endp
@@end:
end start

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

Предыдущая тема: .NET GUI компоненты


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.