singlepost

помогите с ассемблером << На главную или назад  

помогите пожалуйста. Подскажите что неправильно.
мне надо посчитать значения функции Y=(x-5)+x/8, где x=0..9
вот что я сделал

procedure Sup(i:smallint);
begin
Form1.Memo1.Lines.Add(inttostr(i))
end;
procedure TForm1.Button1Click(Sender: TObject);
Var j:integer;
begin
memo1.Clear;
asm
mov ecx,9
mov ebx,1
@L:
mov edx,ebx
sub edx,5
mov eax,ebx
div 2
add eax,edx
inc ebx
push ecx
call Sup
Loop @L
end;
end;
end.

вообще как делить поясните плиз… Буду благодарен.

69 ответов в теме “помогите с ассемблером”

  1. 15
    Владимир Ворошилов ответил:

    люди помогите пож-та….нужно узнать количество ненулевых символов в строке…..на вход бинарная строка не более 32 бит, вводимая с клавы…на выходе количество единиц в 10-ой системе….самое начало есть….но что то, блин, не могу никак осуществить….:((
    .model small
    .8087
    .data
    msgin db " введите бинарную строку",0dh,0ah,'$'
    msgrez db " вы ввели ",0dh,0ah,'$'
    msgenddb "для завершения нажмите Enter",0dh,0ah,'$'
    newstrdb 0dh,0ah,'$'
    Vvoddb 44 dup (0) ,0dh,0ah,'$';"????????????
    len_Buffer = $-Vvod
    db" "
    db 0dh,0ah,'$'

    .code
    start:
    mov ax,DGROUP
    mov ds,ax

    ; вывод сообщения
    mov dx,offset msgin
    mov ah,9
    int21h

    ; ввод символа с клавиатуры
    mov bx, 0
    mov dx, offset Vvod
    mov ah, 3fh
    int 21h

    ; перевод курсора на след строку
    mov dx,offset newstr
    mov ah,9
    int 21h

    ; вывод сообщения
    mov dx,offset msgrez
    mov ah,9
    int21h

    mov dx,offset Vvod
    mov ah,9
    int21h

    ; перевод курсора на новую строку
    mov dx,offset newstr
    mov ah,9
    int21h

    ; вывод сообщения
    mov dx,offset msgend
    mov ah,9
    int21h

    ; ввод символа с клавиатуры
    mov bx, 0
    mov dx, offset Vvod
    mov ah, 3fh
    int21h

    ;……………………………………………………………………….

    ;*******************************************************
    ; завершение работы программы
    mov ax,4c00h
    int 21h
    end start
    ;*******************************************************

  2. 14
    Александр Пинский ответил:

    2 Антон Щиров
    <В Делфи, если не указано обратное, стоит модель вызова register>
    Разве? Хм, надо что ли справочники поднять – освежить память )

  3. 13
    Антон Щиров ответил:

    2 Александр Пинский
    >> Далее, команду push вижу, команду pop нет
    > Тут, как раз, по-моему всё нормально – паскалевский вызов процедур сам чистит стек перед возвратом.
    В Делфи, если не указано обратное, стоит модель вызова register, т.е. первые три параметра передаются через eax, edx, ecx

    > Гораздо больше настораживает другое – если не ошибаюсь, smallint имеет размер в 2 байта, а push ecx помещает в стек 4 байта.
    Это уже мелочи, учитывая тот факт, что параметр ищется в ax, а не в стеке :) ))

  4. 12
    Алена Монастырецкая ответил:

    я не знаю как ето сделать :'(

  5. 11
    Алена Монастырецкая ответил:

    да…….. подробнее))))))
    как можно подробнее))))))

  6. 10
    Александр Пинский ответил:

    2 Альона ЧуДушко Monastyretskaya
    <сделала вид, что поняла, что такое "отладчика защищённого режима ">
    Радуйся, что не знаешь – от этого крыша может съехать ;-)

    Теперь более-менее понятно:
    1. Нужно написать, как всё это дело будет выглядеть после трансляции в машинный код.
    2. Это как я понимаю из серии "Косвенная со смещением", "Коссвенная с базой и смещением" и т.д.
    3. Для каждой операции, обращающейся к памяти, написать логический адрес (сегмент:смещение) и физический (сегмент*16+смещение)
    4. Показать, как меняется содержимое регистров и памяти после выполнения каждой команды (типа, в регистре было число 5, добавили 4 и получили 9)

    Понятно, или подробнее написать?

  7. 9
    Алена Монастырецкая ответил:

    ага *сделала вид, что поняла, что такое "отладчика защищённого режима "*

    X DW 04, OE593H, -22. ODDC5H, 07
    DQ OA34A43523AH, 41E792H

    Y DW 25, 79CCH, -78, 02B3H, 06, OD5H
    DQ 2D59265912H, OE8DE7EB92BH

    BEGIN:
    LEA DI, X
    LEA SI, Y
    MOV CX,[DI]+15
    MOV BX,[SI]+26
    ADD CX, BX
    MOV BX,OD412H
    MOV AX,[BX+SI+2BFFH]

    и вот с этим надо:
    —-отобразить представление исходных данных и команд в виде непрерывного фрагмента оперативной памяти (16-ричная система счисления),
    —указать способ адресации операндов,
    —вычислить физический, логический адрес адресуемой ячейки,
    —отобразить содержимое регистров и памяти после выполнения команд

  8. 8
    Александр Пинский ответил:

    2 Альона ЧуДушко Monastyretskaya
    Можно задание подробнее? А то в такой формулировке смахивает на задание по разработке отладчика защищённого режима (что вряд ли имеет место).

  9. 7
    Алена Монастырецкая ответил:

    пожалуйста может кто-то помочь с ассемблером? :(
    дана какая-то программа нужно: "указать способ адресации" "вычислить физический, логический адрес ячейки" и "отобразить содержимое регистров и памяти после выполнения команд" :(

    я просто не знаю что с этим делать ( я ооооооочень прошу помогите (

  10. 6
    Александр Пинский ответил:

    Вообще, если нужно целочисленное деление (без остатка) попробуй такую ассемблерную вставку – может покатит (проверить сейчас не могу, асма под рукой нету)

    mov cl, 10 'cl = [10,1]
    @calc_loop:
    mov al, 10 'al = 10
    sub al, cl 'al = 10-cl = x+1
    dec al 'al = x
    mov ah, al 'ah = x
    sub ah, 5'ah = x – 5
    sar al, 3'al = x/8 (целочисленно)
    add al, ah 'al = x/8 + (x – 5)
    xor ah, ah 'ah = 0 -> ax = al = (x-5) + x/8
    push ax'Параметр процедуры в стек
    call Sup 'Вызов процедуры
    dec cl 'Уменьшение счетчика на единицу
    jnz @calc_loop 'Переход, если результат последней арифметической операции не ноль

  11. 5
    Александр Пинский ответил:

    2 Макс Андреев
    Тебе делить нужно как целое число (4/8 = 0) или как дробное (4/8 = 0.5)?

    2 Антон Щиров
    <Далее, команду push вижу, команду pop нет>
    Тут, как раз, по-моему всё нормально – паскалевский вызов процедур сам чистит стек перед возвратом.

    Гораздо больше настораживает другое – если не ошибаюсь, smallint имеет размер в 2 байта, а push ecx помещает в стек 4 байта. При таком вызове процедуры стек не будет правильно очищен.

  12. 4
    Татьяна Дубровская ответил:

    Асемблер-жопа!сдала и открестилась и,лично мне,нигде не пригодился..у нас книга была толстая такая,хорошая,где все доступно объяснено,к сожалению автора не помню

  13. 3
    Yarik Blame ответил:

    СПС Всем… Я сдал архитектуру компа на 4 ;)

  14. 2
    Антон Щиров ответил:

    Вы разве не знаете, что в Delphi можно свободно использовать только регистры EAX, ECX и EDX. Все осстальные надо сохранять и восстанавливать.

    Далее, команду push вижу, команду pop нет

    Вместо div, в данном случае лучше использовать shr

  15. 1
    Макс Андреев ответил:

    нет нам не говорили именно про делфи, на чисто про асм что-то рассказывали, а так лабы на делфи делаем, так что вот беда

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.