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

» Assembler

Автор: Abs62
Дата сообщения: 30.05.2010 22:36

Цитата:
значит например из es:[bx] в es:[bx+100]
это означает что другая область того же сегмента

mov AL, ES:[BX+10] - это значит занести в al значение, лежащее по адресу ES:[BX+10]. Что находится там? Asource находится по адресу ES:[BX], оттуда и надо брать.

Цитата:
Вас не понял, ну извините меня, не очень в ассемблере разбираюсь.

Вот как раз повод разобраться.
Тем более, что в комментариях к коду уже написано, какой сегментный регистр используется по умолчанию и зачем нужно явное указание на сегмент.

Цитата:
Должен быть mov DI, offset Dest ? так я понял?

Да.
Автор: T1000m
Дата сообщения: 05.06.2010 02:10
Как переключиться в защищённый режим процессора в 16-разрядном ассемблере, если такое возможно?
Спасибо.
Автор: akaGM
Дата сообщения: 07.06.2010 10:46
саму программу сделать 'в' просто:

.386P

а 'из' 'в' скакать...
можно вопрос: а что за задача?
Автор: pitopito
Дата сообщения: 12.06.2010 19:37
здравсвуйте!
; суть куска программы - записать в структуру 9 чисел, использовал макрос irpc, работает он почему то как irp, то есть он берёт и заменяет строку mov matrix1.e&w&, al на mov matrix1.e1, al mov matrix1.e2, al и тд, хотя в юрове чётко написано что на каждой итерации идентификатор должен заменяться на очередной элемент строки, а не разворочиваться в ряд строк из элементов или я что-то неправильно понимаю???
;
.model small
.stack 100h
.data
matrix struc
e1 db 0
e2 db 0
e3 db 0
e4 db 0
e5 db 0
e6 db 0
e7 db 0
e8 db 0
e9 db 0
matrix ends
matrix1 matrix <0,0,0,0,0,0,0,0,0>
matrix2 matrix <0,0,0,0,0,0,0,0,0>
msg1 db "‚ўҐ¤ЁвҐ ¬ ваЁжг", 0Dh,0Ah, '$'
.code

begin:


mov ax, DGROUP
mov ds, ax
mov dx, offset msg1
mov ah, 9
int 21h

mov cx, 9
@INPUT_MATRIX: mov ah, 01h ; ўў®¤ ¬ ваЁжл [ al = askii ]
int 21h
irpc w, 123456789
mov matrix1.e&w&, al
    endm
loop @INPUT_MATRIX

mov cx, 9
@OUTPUT_MATRIX:
irpc q, 123456789
mov dl, matrix1.e&q&
endm
mov ah, 2
int 21h
loop @OUTPUT_MATRIX


mov ax, 4C00h ; ‡ ўҐаиҐ-ЁҐ Їа®Ја ¬¬л
int 21h

end begin


Добавлено:
извините, я уже сам допёр что irpc сам посути является циклом, однако получается что как то криво у юрова написано, ввёл меня в заблуждение(


но так я и не допёр до различия irpc и irp
Автор: T1000m
Дата сообщения: 12.06.2010 20:28
Необходимо при нажатии клавосочетания заблокировать определённую кнопку на клавиатуре. При повторном нажатии того же клавосочетания - разблокировать. Для линукса. Помогите, пожалуйста, советом, ссылкой, сниппетом или чем-нибудь ещё. Спасибо!
P.S. Можно на си
Автор: bomzzz
Дата сообщения: 12.06.2010 20:31
прерывания перепрограмируешь для клавиши, потом вернешь старое, процедура стандартная, наверняка болванку программы нагуглишь
Автор: T1000m
Дата сообщения: 12.06.2010 20:36
bomzzz, спасибо.
Это только через драйвер реализуется? Всё, что нагуглил - все примеры через драйвер.
Автор: bomzzz
Дата сообщения: 12.06.2010 20:38
наверно имеешь ввиду не драйвер, а программу резидент (драйвер тоже резидентная прога). ну вот поищи гуглой - как написькать программу резидент наверняка что нить подходящее готовое подвернется, тама ниче сложного нет для такого простого действия.

Добавлено:
ну а как ты это представляешь, ты что то на компе делаешь, а он все время должен сидеть мониторить когда ты на те клавиши нажмешь - конечно резидентная прога нуна
Автор: T1000m
Дата сообщения: 12.06.2010 20:44

Цитата:
тама ниче сложного нет для такого простого действия

даже не смотря на то, что под линукс это всё?
Для доса да, всё несложно получается.
Автор: bomzzz
Дата сообщения: 12.06.2010 20:47
да просто для доса, для 32 битного процессора возможно и посложнее
Автор: T1000m
Дата сообщения: 13.06.2010 23:04
Нужен пример реализации "падающих" букв (типа заставок Матрица) на ассемблере (либо на си со вставками ассемблерными), может кто встречал подобное в сети либо в книжках. Спасибо!
Автор: perdun
Дата сообщения: 14.06.2010 18:52
фсем здрасти
плз,поправьте,где не так
рисую на фасме такую конструкцию
хочу перенаправить ввод данных со стд.ввода на вывод другого консольного процесса (cmd.exe)
чота неврублюсь где криво, толи в структурах чота недоделал, толи с наследованием создаваемого процесса.. но вывод на новый смд не идет

Код: format PE console
include 'win32ax.inc'
.data

struct STARTUPINFO
hin dd ?
hout dd ?
ends

fname db 'cmd.exe',0
string db 100 dup ?

sinfo STARTUPINFO
pinfo PROCESS_INFORMATION
ns dd ?

.code
start:
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov [sinfo.hout],eax

invoke GetStdHandle,STD_INPUT_HANDLE
mov [sinfo.hin],eax

invoke CreateProcess, NULL, fname, NULL, NULL, TRUE,\
CREATE_NEW_CONSOLE,NULL,NULL,sinfo,pinfo

invoke ReadFile,[sinfo.hin],string,100,ns,NULL

invoke WriteFile,[sinfo.hout],string,100,ns,NULL

invoke ExitProcess,0

.end start
Автор: bomzzz
Дата сообщения: 24.06.2010 19:47
а как написать 32 битное приложение не под виндовс? ну то есть какой компилятор надо??? а как тогда к прерываниям биос обращаться???

Добавлено:
сори нашел - не сообразил как в гугле набирать

http://www.wasm.ru/series.php?sid=20
Цикл статей «Процессор INTEL в защищенном режиме»

http://wasm.ru/article.php?article=ia32int
СТАТЬИ &#8658; Защищенный режим
Автор: blaro
Дата сообщения: 25.06.2010 22:20
Всем привет! Осваиваю ФАСМ. Написал маленькую прогу которая печатает строку на экране.

Код:
format PE GUI
entry main
section '.data' data readable writeable
msg db "Hello world 12345678"
msglen db $-msg

section '.code' code readable executable
main:
mov ax,0b800h
mov es,ax
xor si,si
lea si,msg
xor di,di
mov ah,9fh
mov cx,word ptr msglen
lp1:
mov al,[si]
mov es:[di],ax
inc si
add di,2
loop lp1
mov ah,4Ch
int 21h
int 20h
Автор: bomzzz
Дата сообщения: 25.06.2010 22:28
http://www.emu8086.com/
ключик нетрудно найти
Добавлено:
lea si, [msg]
у тебя еще одна ошибка
mov es:[di],ax
Автор: blaro
Дата сообщения: 25.06.2010 22:53
bomzzz

Цитата:
у тебя еще одна ошибка
mov es:[di],ax

Я знаю. И как это исправить? Я до сего дня писал под ДОС на 8086.
Автор: bomzzz
Дата сообщения: 25.06.2010 22:56
вот уж не знаю как исправить - лень разбираться в коде, зависит от того что ты хотел этим сделать

Добавлено:
вот эмулятор скачай, там фасм, твой код изменять вообще не пришлось, и наглядно разберешься что как работает. в инете есть кейгенератор подходящий на последнюю 08 версию

Добавлено:
вот прога печатающая строку на екроне
[more]
; "hello, world!" step-by-step char-by-char way...
; this is very similar to what int 21h/9h does behind your eyes.
; instead of $, the string in this example is zero terminated
; (the Microsoft Corporation has selected dollar to terminate the strings for MS-DOS operating system)

name "hello"

org 100h ; compiler directive to make tiny com file.

; execution starts here, jump over the data string:
jmp start

; data string:
msg db 'Hello, world!', 0

start:

; set the index register:
mov si, 0

next_char:

; get current character:
mov al, msg[si]
; is it zero?
; if so stop printing:
cmp al, 0
je stop

; print character in teletype mode:
mov ah, 0eh
int 10h

; update index register by 1:
inc si

; go back to print another char:
jmp next_char


stop: mov ah, 0 ; wait for any key press.
int 16h

; exit here and return control to operating system...
ret

end ; to stop compiler.

this text is not compiled and is not checked for errors,
because it is after the end directive;
however, syntax highlight still works here.

[/more]
Автор: blaro
Дата сообщения: 25.06.2010 23:08
bomzzz

Цитата:
зависит от того что ты хотел этим сделать

Вообще то я хотел вывести строку на экран в консоли.
Автор: bomzzz
Дата сообщения: 25.06.2010 23:13
ну так и обошелся бы одной строкой тогда. этой строкой ты видмо хотел получить элемент массива
; get current character:
mov al, msg[si]

Добавлено:

Цитата:

name "hello"
org 100h
jmp start
msg db 'Hello, world!', 0
start:
mov si, 0
next_char:
mov al, msg[si]
cmp al, 0
je stop
mov ah, 0eh
int 10h
inc si
jmp next_char
stop:
mov ah, 0
int 16h
ret

end
Автор: bomzzz
Дата сообщения: 27.06.2010 02:01
blaro
всосал че ты этим хотел сделать - сохранить значение регистра. посматри если скачал эммулятор пример print

Цитата:

mov cs:temp1, si ; protect si register.
ret
; variable to store original
; value of si register.
temp1 dw ?


не сталкивался с такой конструкцией, и не понимаю зачем это так
Автор: blaro
Дата сообщения: 27.06.2010 10:06
bomzzz

Цитата:
всосал че ты этим хотел сделать - сохранить значение регистра.

Нет. Я хотел передать строку в сегмент памяти на видеокарте, который начинается с 0B800H. В тасме это легко сделать, а вот как в фасме сделать еще не знаю. Но я узнаю.
Автор: bomzzz
Дата сообщения: 27.06.2010 11:16
хм. совсем не так ета делаеца

Добавлено:
вот я на турбо-бейсике делал для 12 режима экрана. на ассемблер так и не стал переписывать. но тут тотже принцип прямое обращение к портам видео карты, использование прерываний, и прямое заполнение видео памяти. удобно сначала на турбо бейсике написать, чтоб алгоритм проверить, а потом на ассемблер переделкать
[more]
OPEN "B", #1, "MYPIC1.BMP"
SEEK#1, 54

SCREEN 12, 1
Reg 1,&H4F02
Reg 2,&H101
Call Interrupt &h10


FOR U%=0 TO 255

N$=""
Blue$=""
Green$=""
Red$=""

GET$ #1, 1, Blue$
GET$ #1, 1, Green$
GET$ #1, 1, Red$
GET$ #1, 1, N$

Blue% = ASC(Blue$)
Green% = ASC(Green$)
Red% = ASC(Red$)

OUT &H3C8, U%
OUT &H3C9, Red%/4
OUT &H3C9, Green%/4
OUT &H3C9, Blue%/4

NEXT U%


seek #1, 1078

f&=640
DEF SEG = &HA000

for j%=479 to 0 STEP -1
for u%=0 to 639

INDEX$=""
GET$ #1, 1, INDEX$
INDEX%=ASC(INDEX$)

r&=f&*j%+u%
k%=int(r&/65536)
r&=r&-65536*k%
if k%=d% then 10
Reg 1,&H4F05
Reg 2,&H0
Reg 4, k%
Call Interrupt &h10
d%=k%
10 POKE r&, INDEX%

next u%
next j%



20 on len(inkey$)+1 goto 20

for j%=0 to 479
for u%=0 to 639

r&=f&*j%+u%
k%=int(r&/65536)
r&=r&-65536*k%
if k%=d% then 25
Reg 1,&H4F05
Reg 2,&H0
Reg 4, k%
Call Interrupt &h10
d%=k%
25 POKE r&, int(256*(j%/480))

next u%
next j%

30 on len(inkey$)+1 goto 30

[/more]
http://turbo-basic.narod.ru/TBDEMO-256-H101.rar думаю если порыться можно и на ассемблере найти пример с заполнением видео памяти
Автор: blaro
Дата сообщения: 27.06.2010 12:51
bomzzz

Цитата:
совсем не так ета делаеца

Почему не так? Я недавно такую прогу написал. Скомпилил по всем правилам и прогнал в Турбо дебагере. Все сработало.
Автор: bomzzz
Дата сообщения: 27.06.2010 13:01
ну а почему тогда ошибка?
Автор: blaro
Дата сообщения: 27.06.2010 13:07
Не знаю. Я так писал:
[more]

Код:
name lab5t1
data segment
data ends

sseg segment stack
dw 100h dup(?)
sseg ends

code segment
    assume cs:code, ds:data, ss:sseg
start:
    mov ax, 0b800h
    mov ds, ax
    mov si,0
    mov cx,4000
lp1:    mov [si],2461h
    add si,2
    dec cx
    jnz lp1
    mov ah,4ch
    int 21h
code ends
end start
Автор: bomzzz
Дата сообщения: 27.06.2010 14:07
где ты такой синтаксис нашел mov a:b,c чета роюсь роюсь не могу найти вообще.
Автор: blaro
Дата сообщения: 28.06.2010 08:43
Ты имеешь в виду mov es:[di],al? Так это обычный интеловский синтакс с 86 года.
Автор: bomzzz
Дата сообщения: 14.07.2010 18:38
вот знал и чета вылетело из головы, и нагуглить не могу. как вернуть код ошибки в 16 битном приложении?

Автор: Abs62
Дата сообщения: 14.07.2010 20:07
bomzzz
Вернуть откуда и куда? Если из программы в DOS, то функция 4Ch прерывания 21h, код возврата - в al.
Автор: bomzzz
Дата сообщения: 14.07.2010 23:52
ага, спс огромное. как только в гугле не набирал не пришел никуда

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

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


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