Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > как формировать opcode


Автор: scuter 24.11.2011, 00:42
к сожалению я могу писать ASM коды только на flat assembler
компилятор этот неплохой, только вот не хочет он компилить некоторые команды

в связи с такими обстоятельствами приходится вводи команды opcode-ми
если команда цельная, такая как XLAT MOVSB
токоманду просто ввести, но если в команде используются указатели на регистры или стек
возникает затруднения


к примеру комманда LDS в opcode пишут C5 r
Код


MOV r/m32,segreg              ; o32 8C /r            [386]
MOV memoffs32,EAX             ; o32 A3 ow/od         [386]
MOV r/m32,imm32               ; o32 C7 /0 id         [386]
MOV EAX,memoffs32             ; o32 A1 ow/od         [386]
MOV reg32,imm32               ; o32 B8+r id          [386]
MOV reg32,r/m32               ; o32 8B /r            [386]
MOV r/m32,reg32               ; o32 89 /r            [386]
MOVSD                         ; o32 A5               [386]
MOVSX reg16,r/m8              ; o16 0F BE /r         [386]
MOVSX reg32,r/m8              ; o32 0F BE /r         [386]
MOVSX reg32,r/m16             ; o32 0F BF /r         [386]
MOVZX reg16,r/m8              ; o16 0F B6 /r         [386]
MOVZX reg32,r/m8              ; o32 0F B6 /r         [386]
MOVZX reg32,r/m16             ; o32 0F B7 /r         [386]
CMP AL,imm8                   ; 3C ib                [8086]
CMP AX,imm16                  ; o16 3D iw            [8086]
DAA                           ; 27                   [8086]
DAS                           ; 2F                   [8086]
DEC reg16                     ; o16 48+r             [8086]
DEC r/m8                      ; FE /1                [8086]
DEC r/m16                     ; o16 FF /1            [8086]
DIV r/m8                      ; F6 /6                [8086]
DIV r/m16                     ; o16 F7 /6            [8086] 

скажите как мне переводить это всё безобразие
и как формировать нормальный код

Автор: arcsupport 24.11.2011, 09:49
Простите, пожалуйста, а не могли бы Вы привести шапку программы.
Я подозреваю, что у Вас там имеются ошибки.

Автор: 500mhz 24.11.2011, 10:12
что то вы не так делаете, FASM компилит все, и вдоль и поперек.
на мой взгляд на данный момент это самый продвинутый и поддерживаемый компилятор

Автор: scuter 24.11.2011, 10:58
Цитата(500mhz @  24.11.2011,  10:12 Найти цитируемый пост)

что то вы не так делаете, FASM компилит все, и вдоль и поперек.
на мой взгляд на данный момент это самый продвинутый и поддерживаемый компилятор

да трудно не согласится 
на FASM сделали KolibriOS и MenuetOS

только разработчеки FASM решили сделать язык ассемблер по проще
и теперь не разберёшь каким боком писать под это дело


arcsupport, тут не шабка программы
а error: illegal instruction.
на каждой строчке.

Автор: 500mhz 24.11.2011, 11:01
scuter 
выложи код где у тебя не работает xlat

Автор: scuter 24.11.2011, 11:05
Код

use16
    ORG    100H

MAIN:   ; PROC    NEAR
    CLI
    MOV    AX, 2501H
    MOV    DX, INT01
    INT    21H
    MOV    AX, 2503H
    MOV    DX, INT03
    INT    21H
    STI

    PUSHF
    POP    AX
    OR    AX,0000000100000000B
    PUSH    AX
    POPF
egens:
    MOV    AH,09H
    MOV    DX, MSG
    DB    0CCH
    INT    21H

    MOV    AX,1234H
    MOV    BX,5678H
    ADD    AX,BX
    MOV    DX,AX
    NOT    AX
    ADD    DX,AX
    xor     ah,ah                   ;wait key function number
    int     16h                     ;BIOS keyboard interrupt
    jmp egens
    RET    6

MSG    DB    'Debugger is running.', 0DH, 0AH, '$'
;MAIN    ENDP

INT01:    ;PROC    NEAR
    PUSH    AX DX DS

    PUSH    CS
    POP    DS

    PUSH    DX
    PUSH    AX
    MOV    AH,09H
    MOV    DX,SAX
    INT    21H
    CALL    HEXOUTW
    MOV    DX,SEND
    INT    21H

    MOV    DX,SBX
    INT    21H
    PUSH    BX
    CALL    HEXOUTW
    MOV    DX,SEND
    INT    21H

    MOV    DX,SCX
    INT    21H
    PUSH    CX
    CALL    HEXOUTW
    MOV    DX,SEND
    INT    21H

    MOV    DX,SDX
    INT    21H
    CALL    HEXOUTW
    MOV    DX,SEND
    INT    21H

    MOV    DX,SSI
    INT    21H
    PUSH    SI
    CALL    HEXOUTW
    MOV    DX,SEND
    INT    21H

    MOV    DX,SDI
    INT    21H
    PUSH    DI
    CALL    HEXOUTW
    MOV    DX,SEND
    INT    21H
    INT    21H

    MOV    AH,10H
    INT    16H
    POP    DS DX AX
    IRET
SAX    DB    'AX=$'
SBX    DB    'BX=$'
SCX    DB    'CX=$'
SDX    DB    'DX=$'
SSI    DB    'SI=$'
SDI    DB    'DI=$'
SEND    DB    0DH,0AH,'$'
;INT01    ENDP

INT03:  ;  PROC    NEAR
    PUSH    AX
    MOV    AX,0E07H
    INT    10H
    POP    AX
    IRET
;INT03    ENDP


HEXOUTW:  ;  PROC    NEAR
    PUSH    BP
    MOV    BP,SP
    PUSH    AX BX CX DX DS
    PUSH    CS
    POP    DS
    MOV    BX,HEXTBL
    MOV    CL,4
    MOV    AX,[BP+4]
    MOV    AL,AH
    CALL    HEXOB
    MOV    AX,[BP+4]
    CALL    HEXOB
    POP    DS DX CX BX AX BP
    RET    2
HEXOB:    PUSH    AX
    SHR    AL,CL
    CALL    HEXO4
    POP    AX
    AND    AL,00001111B
    CALL    HEXO4
    RET
HEXO4:    
    DB     0D7H ;XLAT
    MOV    AH,02H
    MOV    DL,AL
    INT    21H
    RET
HEXTBL    DB    '0123456789ABCDEF'
  RET
;HEXOUTW    ENDP
    ;END    MAIN

проблема та не только в этом, нужны команды
Код

LGDT ;Загрузка регистра таблицы глобальных дескрипторов 
LIDT ;Загрузка регистра таблицы дескрипторов прерываний
LLDT ;Загрузка регистра таблицы локальных дескрипторов
LMSW ;Загрузка слова состояния машины
VERR ;Проверка сегмента на чтение
VERW ;Проверка сегмента на запись
LDS ;Загрузка указателя с использованием регистра DS
LES ;Загрузка указателя с использованием регистра ES
LFS ;Загрузка указателя с использованием регистра FS
LGS ;Загрузка указателя с использованием регистра GS
LSS ;Загрузка указателя с использованием регистра SS

и ещё множество других комманд

Автор: 500mhz 24.11.2011, 12:24
xlatb
xlat[bx]

Автор: scuter 24.11.2011, 12:55
500mhz, по пробуй запустить такую инструкцию

Код

  addr db 'som text'
  les SI,addr

или такую
Код

  addr db 'som text'
  lds SI,addr

Автор: 500mhz 24.11.2011, 13:05
и что?
lds ax,[si]

Добавлено через 1 минуту
не понятно что вы хотите делать с lds к примеру?

Автор: iff 24.11.2011, 13:11
scuter, зачем в 34-ой строке ret 6. Во первых откуда 6? Команда ret позволяет завершить com-программу. но так как у вас бесконечный цикл, то её вообще можно убрать (она никогда не выполнится).

Автор: scuter 24.11.2011, 13:14
Цитата(500mhz @  24.11.2011,  13:05 Найти цитируемый пост)

и что?
lds ax,[si]

самое главное не пробует, а пишет
Код

  addr db 'som text'
  les SI,addr

FASM пишет
Цитата

les SI,addr
error: invalid operand.

если заглянуть в описание команды
Цитата

LES Загрузка указателя с использованием регистра ES
    les reg,mem

эквивалентна следующей группе команд:

    mov reg,word ptr mem

     mov ES,word ptr mem+2

Пример 1


    ;В полях данных:
    addr dd myproc ;Двухсловный адрес процедуры
    ;myproc
    ;В программном сегменте:
    les SI,addr ;ES:SI ® myproc

Пример 2


    ;В полях данных:
    mem dw 25 ;Ячейка памяти с
    ;произвольным содержимым
    addr dd myproc ;Двухсловный адрес этой ячейки
    ;В программном сегменте:
    mov BX,offset addr ;ВХ=адрес ячейки addr
    …
    les DX, [BX] ; DХ=смещение ячейки mem,
    ;ЕS=сегментный адрес ячейки mem



это означает что в FASM далеко не все команды поддерживаются

Автор: iff 24.11.2011, 13:15
scuter, на счёт lds и др. - в качестве параметра нужно передовать не текст а адрес.
напрмер в tasm это выгядит так:
Код

addr dd 12345678h
;...
les si, addr

тогда es=1234h, а si=5678h.

Автор: scuter 24.11.2011, 13:42
Цитата(iff @  24.11.2011,  13:15 Найти цитируемый пост)

scuter, на счёт lds и др. - в качестве параметра нужно передовать не текст а адрес.
напрмер в tasm это выгядит так:
Код

addr dd 12345678h
;...
les si, addr

тогда es=1234h, а si=5678h.

именно это и требуется от команды
можед быть TASM это дело поддерживает но FASM поддерживает эту комманду в другом формате
Код

  addr dd 12345678h
  mov BX,offset addr
  les DX, [BX]

а как сделать этот offset в FASM непонятно
ничего не помогает.

Автор: 500mhz 24.11.2011, 13:54
не нада в фасме offset

Автор: scuter 24.11.2011, 14:52
Цитата(500mhz @  24.11.2011,  13:54 Найти цитируемый пост)
не нада в фасме offset

а что писать.

так как http://flatassembler.net/docs.php?article=manual написано уже перепробовано.

Автор: 500mhz 24.11.2011, 15:02
просто

mov BX,addr

Автор: scuter 24.11.2011, 16:16
Цитата(500mhz @  24.11.2011,  15:02 Найти цитируемый пост)

просто
mov BX,addr


спосибо, пояснение

но всё таки мне нужно узнать как формировать команды

Цитата

FADD    D8 /0  ST  m32real 


вот идёт команда с описанием

с начала название команды
FADD

потом цифра 0-7 или r  ничего не указывается
/0

потом названия регистров которые используются
прямо называется регистр AL, BX,DX ......
либо указывается общий формат регистра или указателя    m16/32 ,  r/m16/32, m16/32&16/32, imm16/32, m32real 

так вот как перевести это дело в нормальнай вид

как правильно сформировать вторую часть команды

т.е. как записываются регистры
m8/16/32

как такие 
r/m8/16/32

r8/16/32

imm8/16/32

xmm/m128

mm/m64 

m64

rel8/16/32

m32real, m64real

m32int


и что всё таки означает эта цифорка 0-7 или r после Opcode

http://ref.x86asm.net/coder32.html

Автор: iff 24.11.2011, 17:45
Цитата

Формат записи инструкцийИспользуется Intel-синтаксис записи инструкций.

Единственное существенное отличие от формата, принятого в других ассемблерах (MASM, TASM в режиме совместимости с MASM) — значение ячейки памяти всегда записывается как [label_name], а просто label_name означает адрес (то есть порядковый номер) ячейки. Это позволяет обходиться без ключевого слова offset. Также в fasm при переопределении размера операнда вместо byte ptr пишется просто byte, вместо word ptr — word и т. д. Не позволяется использовать несколько квадратных скобок в одном операнде, таким образом вместо [bx][si] необходимо писать [bx+si]. Эти изменения синтаксиса привели к более унифицированному и лёгкому для чтения коду.

http://ru.wikipedia.org/wiki/FASM

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)