fasm понимает название переменной как адрес. То есть чтобы обратиться к переменной всегда нужны скобки mov [x], 1 mov [x+5], 1 mov [x], al mov eax, [x] допустим в pBuf адрес буфера mov esi, [pBuf] mov al, [esi+10] так в al будет десятый байт буфера mov [esi+10], ah так десятым байтом буфера станет содержимое ah
Ребят, кому не жалко и если есть свободное время. Думаю тем кто знает asm это будет достаточно тривиально.. на TASMе на консоль вывести просто любые положительные и любые отрицательные числа... Буду благодарен=) [Актуально до 29.1108]
уже писал в асю, напишу здесь вдруг кому понадобится. что делает: выводит числа (процедура procoutnum делает форматный вывод), число находится в ax (передается в процедуру procoutnum) (в ax именно число, а не код символа) фичи (для процедуры procoutnum): dl - длина поля для вывода числа (если dl меньше количества цифр в числе, то число выводится примыкаясь к предыдущевыведенному, что-то на подобии форматного вывода ф-ции write в паскале) dh = 1 формат вывода со знаком (-1 выведется как -1) dh = 2 формат вывода без знака (-1 выведется как 65535) в основной "процедуре" start два цикла для вывода чисел от 0 до 9 и от -1 до -10 Code: stack segment stack dw 128 dup(?) stack ends code segment assume cs: code procoutnum proc far push bp mov bp,sp push ax push dx push si sub sp,6 cmp dh,1 jne pon0 cmp ax,0 jge pon0 mov dh,2 neg ax pon0: push dx xor si,si pon1: mov dx,0 div cs:ten add dl,'0' mov byte ptr [bp-12+si],dl inc si or ax,ax jnz pon1 pop dx cmp dh,2 jne pon2 mov byte ptr [bp-12+si],'-' inc si pon2: mov dh,0 mov ah,2 pon21: cmp dx,si jle pon3 push dx mov dl,' ' int 21h pop dx dec dx jmp pon21 pon3: dec si mov dl,byte ptr [bp-12+si] int 21h or si,si jnz pon3 add sp,6 pop si pop dx pop ax pop bp ret ten dw 10 procoutnum endp start: mov cx, 10 xor ax, ax mov dh,1 mov dl, 2 l: call procoutnum inc ax loop l mov cx, 10 xor ax,ax k: dec ax call procoutnum loop k mov ah, 10h int 16h mov ah, 4ch int 21h code ends end start
Ребята я вообще по 0 в асемблере , нужно вот это написать y=10 если x>5 или x=c y= 12 в других случаях
Доброго времени суток. Надеюсь кто-то из здесь присутствубщих имел когда нибудь дело с отладочным стендом EV8031/AVR (V. 3.2), вот по нему у меня и лаба. Изначально задание было таким: По нажатию кнопки SW15 включать «бегущий огонь» на линейке светодиодов HL1-HL8. Код этой проги вот: Code: CSEG ORG 0 Continue: mov A, #10000000b mov DPTR, #0A006h movx @DPTR, A ;отменить гашение знакомест С_инд mov A, #0h ;записать в Акк. число 04 mov DPTR, #0A006h ;установить в DPTR адрес левой ;пары знакомест С_инд movx @DPTR, A mov DPTR, #0B006h ;установить в DPTR адрес правой ;пары знакомест С_инд movx @DPTR, A CALL ZAD ;вызов подпрограммы задержки mov A, #10000000b mov DPTR, #0A006h movx @DPTR, A ;погасить все знакоместа С_инд CALL ZAD ;вызов подпрограммы задержки mov A, #01000000b mov DPTR, #0A006h movx @DPTR, A CALL ZAD mov A, #00100000b mov DPTR, #0A006h movx @DPTR, A CALL ZAD mov A, #00010000b mov DPTR, #0A006h movx @DPTR, A CALL ZAD mov A, #00001000b mov DPTR, #0A006h movx @DPTR, A CALL ZAD mov A, #00000100b mov DPTR, #0A006h movx @DPTR, A CALL ZAD mov A, #00000010b mov DPTR, #0A006h movx @DPTR, A CALL ZAD mov A, #00000001b mov DPTR, #0A006h movx @DPTR, A CALL ZAD jmp Continue ;переход на начало программы ZAD: ;подпрограмма задержки mov R1, #0FFh C2: mov R2, #0FFh C4: djnz R2, C4 djnz R1, C2 ret ;выход из подпрограммы END Но потом последовало дополнительное задание, звучит: При нажатии кнопки SW15 включать «бегущий огонь» на линейке светодиодов HL1-HL8, при еще одном нажатии "бегущий огонь" должен остановиться, при еще одно - дальше "побежать".... думал две пары как сделать(даже на С++ пытался) - не могу... Помогите плиз...
Ребят, есть вопрос по небольшой проге. вот код: Code: assume cs:code, ds:data code segment org 100h start: lea bx, work mov cx, 10 mov di, 0 ; index (row) a0: push cx push di mov cx, 10 mov di, 0 ;index (column) a1: ;mov [bx+di*2], di mov 2[bx][di], di ; start show number mov ax, 2[bx][di] push cx push di std lea di,StringEnd-1 mov cx,10 iRepeat: xor dx,dx div cx xchg ax,dx add al,'0' stosb xchg ax,dx or ax,ax jne iRepeat mov ah,9 lea dx,[di+1] int 21h mov dx, offset Space int 21h pop di pop cx inc di ;end show number loop a1 pop di ;reincornate di, cx pop cx ; add bx, 10*2 ; go to next line push ax push dx mov ah, 9 mov dx, offset nl int 21h pop dx pop ax loop a0 Space db " ", '$' String db 5 dup (?),'$' ; 5 byte for string StringEnd = $-1 ; Ukazatel' na simvol '$' work dw 100 dup (0h) ;mass work <- 100 word's nl db 0Dh, 0Ah, '$' code ends data segment ends data end start Здесь задается матрица 10*10, заполняется нулями, а затем в двойном цикле заполняется числами (0...9) и на каждой итерации элемент выводится в консоль. Проблема в том, что выводится только 75 элементов, а не все 100 - в чем причина?)
Ребят, помогите пожалуйста... Через консоль должно вводиться шестнадцатиричное число. Для ввода использую ReadConcole. Как работать с переменной, куда ввел все это, как с числом в шестнадцатиричной системе, а не как со строкой... Использую MASM 10.
вот пример ввода строки, содержащей 16-ое число. процедура Ascii2Hex переводит ее именно в числовой вид Code: .386 .model flat, stdcall option casemap :none include c:\masm32\include\windows.inc include c:\masm32\include\kernel32.inc includelib c:\masm32\lib\kernel32.lib include c:\masm32\include\user32.inc includelib c:\masm32\lib\user32.lib Ascii2Hex PROTO :DWORD cprintf PROTO C :DWORD, :DWORD, :VARARG .data msgStart db "# Enter num: " outformat db "%u", 0 buf db 128 dup (0) .data? hOut dd ? hIn dd ? bw dd ? .code start: invoke GetStdHandle, STD_INPUT_HANDLE mov hIn, eax invoke GetStdHandle, STD_OUTPUT_HANDLE mov hOut, eax invoke WriteFile, eax, offset msgStart, sizeof msgStart, offset bw, 0 invoke ReadFile, hIn, offset buf, sizeof buf - 1, offset bw, 0 mov esi, bw mov BYTE PTR [buf + esi - 2], 0 invoke Ascii2Hex, offset buf invoke cprintf, hOut, offset outformat, eax invoke ExitProcess, 0 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; Перевети hex-строку в число Ascii2Hex proc uses ebx esi lpHexString:DWORD mov esi, lpHexString xor eax, eax xor ebx, ebx @@: mov al, BYTE PTR [esi] test al, al jz @exit shl ebx, 4 .IF al > 040h sub al, 007h .ENDIF xor al, 030h or ebx, eax inc esi jmp @B @exit: mov eax, ebx ret Ascii2Hex endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ;Печатать форматированный текст в консоли cprintf proc C hOutHandle:DWORD, lpFormat:DWORD, arglist:VARARG LOCAL locbuf[2048] :BYTE LOCAL dwWritten :DWORD invoke wvsprintf, addr locbuf, lpFormat, addr arglist mov ecx, eax invoke WriteFile, hOutHandle, addr locbuf, ecx, addr dwWritten, 0 ret cprintf endp end start
Ребята, кто может помочь изучающему асм немного? Литература конечно есть, но это немного не то, практики нет, в которой и познаётся теория. Если вдруг в ком проснулось альтруистичное начало - чиркните мне в icq 192693716
также как и с обычными числами, но предварительно переведя его из строки в число. Алгоритм перевода примерно такой: 1) получаешь длинну строки 2) перебираешь поочереди каждый символ. 3) отнимаешь от символа 48 и получаешь какбыла непосредственно значение. 4) умножаешь число полученное на предудущем этапе на 10 и к нему прибавляешь то, что получилось от символа. 5) повторяешь заного всё пока недостигнут конец строки
Можно я тоже попользуюсь коллективным разумом античата? Цель - написать на ассемблере программу получающую состояние ком порта и работающую в досе. Как по вашему это наиболее грамотно сделать? Вопрос и о самой программе и об инфраструктуре. Сейчас сделал виртуалбокс с досом, попытался настроить так чтобы com порт виртуалки смотрел в COM1 основной машины, но vmbox ругнулся и сказал что прав нет. Это из-за того что XP на основной машине не позволяет работать с портами напрямую? И ещё: если в старый комп с досом воткнуть в com порт мышь, не ставя при этом драйверов - можно ли будет в своей программе (использующей прерывание 14h например) видеть изменение состояния ком порта? А если поставить дрова останется ли возможность работать с портом напрямую? Есть ли разница в данном случае где это всё будет работать в win98 или чистом dos? Вобщем любые идеи, ссылки, исходники приветствуются, а хорошие - плюсуются. Заранее спасибо.
мне нужно обьяснить как работают кусочки кода (коментами если можна) место откуда нужно писать коментарии в исходнике там немножко - помогите кто может(( Code: # Переменные a: .long 1 b: .long 2 c: .long 3 d: .long 4 cc: .byte 10 .text LC0: .ascii "a=%d b=%d c=%d d=%d\12\0" LC1: .ascii "a=%d b=%d c=%d d=%d\12\0" .globl _xxx .def _xxx; .scl 2; .type 32; .endef _xxx: pushl %ebp movl %esp, %ebp subl $8, %esp subl $12, %esp pushl d pushl c pushl b pushl a pushl $LC0 call _printf addl $32, %esp leave ret .globl _func .def _func; .scl 2; .type 32; .endef _func: pushl %ebp movl %esp, %ebp movl %eax, %ecx imul %eax imul %ecx movl %eax,%edx movl $2,%eax mull %ecx #xor %edx, %edx subl %eax, %edx incl %edx movl %edx,%eax pop %ebp leave ret .globl _func1 .def _func1; .scl 2; .type 32; .endef _func1: pushl %ebp movl %esp, %ebp movl 16(%ebp), %eax imul %eax movl 12(%ebp), %ebx imul %ebx movl %eax, %ecx movl 16(%ebp), %eax movl 8(%ebp), %ebx imul %ebx addl %ecx, %eax movl 4(%ebp), %edx subl %edx, %eax pop %ebp leave ret .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp #Начиная отсюда нужно написать обьяснения как #работают задачки #Выполнить сравнение двух чисел a и b: если a>b, то #a=a-b; если a=b, то a=2*a; если a<b, то b=b-a. movl $20, %ecx xorl %ebx, %ebx h: movl %ecx, %eax imul %eax addl %eax, %ebx movl %ebx, a loop h call _xxx #Выполнить сравнение двух чисел a и b: если a>b, то #a=a-b; если a=b, то a=2*a; если a<b, то b=b-a. movl a, %eax movl b, %ebx cmpl %ebx, %eax jg v je x jl z v:subl %ebx, %eax movl %eax, a jmp s1 x:movl a, %eax imul $2, %eax movl %eax, a jmp s1 z:mo vl b,%ebx movl a, %eax subl %eax, %ebx movl %ebx, b jmp s1 s1: call _xxx #Создать функцию y(x)=x3-2*x+1, которая через #регистр eax получает аргумент и возвращает #результат. movl a, %eax call _func movl %eax, a call _xxx #Создать функцию y(x,a,b,c)=a*x2+b*x-c, которая #через стек получает аргументы x, a, b, c и возвращает #результат pushl x pushl a pushl b pushl c call _func1 movl %eax, c addl $16,%esp call _xxx #Вычислить N! (N=30) двумя способами: используя цикл, #рекурсию. movl $1, %eax movl $1, %ebx x3: cmpl 30, %eax jle x1 jg x2 x1:imul %eax, %ebx incl %ebx jmp x3 x2:m ovl %eax, d call _xxx
парни, есть проблема с открытием файла (tasm) 1. делаю файл hook, кладу в папку где лежит мой скомпилированный .com 2. в самой проге основной код такой: Code: mov ax, 3D02h ;открыть файл на чтение и запись mov dx, offset fn int 21h ... fn db "hook",'0' ;имя файла после этого в ax оказывается цифра 05h что, судя по зубкову, означает - доступ запрещен. Почему??
2Kaas бугога ))) имя файла у тебя hook0[много всякого мусора]x00 Делай так : Code: fn db 'hook',0 Хотя странно, должен был вернуть 02h :/ Открой отладчик (codeview хотя бы) и посмотри, что у тебя в регистрах на каждом шаге. Да ещё, когда ты запускал прогу свою, был ли открыт гденибудь ещё этот файл ... пока всё, что пришло в мою больную голову :\
народ, у меня проблема, причём очень странная: запуская ml.exe имя файла /AT я получаю через 3-5 секунд ответ: "Программа не умещается в памяти" вот код программы Code: CSEG segment org 100h Begin: mov ah,9 mov dx,offset Message int 21h int 20h Message db 'Hello, world!$' CSEG ends end Begin Помогите пожалуйста разбраться с этой х***й ноут Asus EEE PC 9