[ Assembler ] — начинающим: задаем вопросы

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by !_filin_!, 25 May 2007.

  1. Jes

    Jes Elder - Старейшина

    Joined:
    16 Apr 2007
    Messages:
    370
    Likes Received:
    391
    Reputations:
    34
    fasm ptr принципиально понимать не хочет :/
     
  2. bons

    bons Elder - Старейшина

    Joined:
    20 Dec 2007
    Messages:
    286
    Likes Received:
    121
    Reputations:
    21
    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
     
    #442 bons, 25 Nov 2008
    Last edited: 25 Nov 2008
    1 person likes this.
  3. A2GIL

    A2GIL Elder - Старейшина

    Joined:
    31 Aug 2007
    Messages:
    84
    Likes Received:
    59
    Reputations:
    -3
    Ребят, кому не жалко и если есть свободное время. Думаю тем кто знает asm это будет достаточно тривиально..

    на TASMе

    на консоль вывести просто любые положительные и любые отрицательные числа...

    Буду благодарен=)

    [Актуально до 29.1108]
     
    1 person likes this.
  4. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    уже писал в асю, напишу здесь вдруг кому понадобится.
    что делает: выводит числа (процедура 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
     
    #444 VERte][, 29 Nov 2008
    Last edited: 29 Nov 2008
  5. Buffalon

    Buffalon Elder - Старейшина

    Joined:
    22 Mar 2008
    Messages:
    241
    Likes Received:
    34
    Reputations:
    8
    Ребята я вообще по 0 в асемблере , нужно вот это написать

    y=10 если x>5 или x=c

    y= 12 в других случаях
     
  6. iv.

    iv. Elder - Старейшина

    Joined:
    21 Mar 2007
    Messages:
    1,183
    Likes Received:
    438
    Reputations:
    107
    Buffalon
    Code:
    cmp x, 5
    jbe ELSE
    cmp x, c
    jne ELSE
    mov y, 10
    jmp CONT
    ELSE: mov y, 12
    CONT: ...
     
  7. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Доброго времени суток. Надеюсь кто-то из здесь присутствубщих имел когда нибудь дело с отладочным стендом 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, при еще одном нажатии "бегущий огонь" должен остановиться, при еще одно - дальше "побежать"....
    думал две пары как сделать(даже на С++ пытался) - не могу...
    Помогите плиз...
     
  8. Kaas

    Kaas Elder - Старейшина

    Joined:
    13 Feb 2007
    Messages:
    31
    Likes Received:
    5
    Reputations:
    0
    Ребят, есть вопрос по небольшой проге. вот код:

    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 - в чем причина?)
     
  9. StealthMaster

    StealthMaster Member

    Joined:
    3 Dec 2008
    Messages:
    52
    Likes Received:
    11
    Reputations:
    0
    Ребят, помогите пожалуйста... Через консоль должно вводиться шестнадцатиричное число. Для ввода использую ReadConcole. Как работать с переменной, куда ввел все это, как с числом в шестнадцатиричной системе, а не как со строкой...

    Использую MASM 10.
     
  10. bons

    bons Elder - Старейшина

    Joined:
    20 Dec 2007
    Messages:
    286
    Likes Received:
    121
    Reputations:
    21
    вот пример ввода строки, содержащей 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
     
    1 person likes this.
  11. 0verbreaK

    0verbreaK Elder - Старейшина

    Joined:
    30 Apr 2008
    Messages:
    318
    Likes Received:
    42
    Reputations:
    -3
    Kaas бинарь свой скинь
     
  12. lll6

    lll6 Elder - Старейшина

    Joined:
    29 Feb 2008
    Messages:
    83
    Likes Received:
    15
    Reputations:
    5
    Ребята, кто может помочь изучающему асм немного? Литература конечно есть, но это немного не то, практики нет, в которой и познаётся теория. Если вдруг в ком проснулось альтруистичное начало - чиркните мне в icq 192693716
     
    1 person likes this.
  13. StealthMaster

    StealthMaster Member

    Joined:
    3 Dec 2008
    Messages:
    52
    Likes Received:
    11
    Reputations:
    0
    Подскажите, пожалуйста, как работать с введенной строкой как с десятичным числом?
     
  14. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    также как и с обычными числами, но предварительно переведя его из строки в число.
    Алгоритм перевода примерно такой:
    1) получаешь длинну строки
    2) перебираешь поочереди каждый символ.
    3) отнимаешь от символа 48 и получаешь какбыла непосредственно значение.
    4) умножаешь число полученное на предудущем этапе на 10 и к нему прибавляешь то, что получилось от символа.
    5) повторяешь заного всё пока недостигнут конец строки
     
    1 person likes this.
  15. reversys

    reversys Elder - Старейшина

    Joined:
    21 Nov 2007
    Messages:
    139
    Likes Received:
    57
    Reputations:
    7
    Можно я тоже попользуюсь коллективным разумом античата? :)
    Цель - написать на ассемблере программу получающую состояние ком порта и работающую в досе.
    Как по вашему это наиболее грамотно сделать? Вопрос и о самой программе и об инфраструктуре.

    Сейчас сделал виртуалбокс с досом, попытался настроить так чтобы com порт виртуалки смотрел в COM1 основной машины, но vmbox ругнулся и сказал что прав нет. Это из-за того что XP на основной машине не позволяет работать с портами напрямую?

    И ещё: если в старый комп с досом воткнуть в com порт мышь, не ставя при этом драйверов - можно ли будет в своей программе (использующей прерывание 14h например) видеть изменение состояния ком порта? А если поставить дрова останется ли возможность работать с портом напрямую? Есть ли разница в данном случае где это всё будет работать в win98 или чистом dos?

    Вобщем любые идеи, ссылки, исходники приветствуются, а хорошие - плюсуются.
    Заранее спасибо.
     
    #455 reversys, 16 Dec 2008
    Last edited: 16 Dec 2008
  16. xxxxxxxxxxxxxxx

    xxxxxxxxxxxxxxx Elder - Старейшина

    Joined:
    20 Jan 2008
    Messages:
    66
    Likes Received:
    8
    Reputations:
    0
    мне нужно обьяснить как работают кусочки кода (коментами если можна) место откуда нужно писать коментарии в исходнике там немножко - помогите кто может((

    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
     
  17. Kaas

    Kaas Elder - Старейшина

    Joined:
    13 Feb 2007
    Messages:
    31
    Likes Received:
    5
    Reputations:
    0
    парни, есть проблема с открытием файла (tasm)


    1. делаю файл hook, кладу в папку где лежит мой скомпилированный .com
    2. в самой проге основной код такой:

    Code:
    mov ax, 3D02h ;открыть файл на чтение и запись
    mov dx, offset fn
    int 21h
    
    ...
    fn db "hook",'0'  ;имя файла
    
    после этого в ax оказывается цифра 05h что, судя по зубкову, означает - доступ запрещен.

    Почему??
     
  18. izlesa

    izlesa Elder - Старейшина

    Joined:
    3 Jan 2008
    Messages:
    112
    Likes Received:
    32
    Reputations:
    5
    2Kaas
    бугога ))) имя файла у тебя hook0[много всякого мусора]x00
    Делай так :

    Code:
    fn db 'hook',0
    Хотя странно, должен был вернуть 02h :/
    Открой отладчик (codeview хотя бы) и посмотри, что у тебя в регистрах на каждом шаге.
    Да ещё, когда ты запускал прогу свою, был ли открыт гденибудь ещё этот файл ... пока всё, что пришло в мою больную голову :\
     
  19. ronald

    ronald Elder - Старейшина

    Joined:
    27 Mar 2008
    Messages:
    252
    Likes Received:
    42
    Reputations:
    6
    народ, у меня проблема, причём очень странная:
    запуская 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
     
  20. dinar_007

    dinar_007 Мадемуазель

    Joined:
    18 Jan 2005
    Messages:
    1,019
    Likes Received:
    770
    Reputations:
    97
    Ссори за нескромный вопрос.. Ты ком файл пытаешься в Висте запустить? :D
     
    2 people like this.