1 Востаннє редагувалося Betterthanyou (21.07.2017 05:56:15)

Тема: [Асемблер8086]Від нуба до професіонала(або шлях на асемблерну вершину)

Нарешті зробив свою першу програму, в якій я розумію що відбувається (до цього я робив і складніші, але по аналогії, і не розумів як працює програма)
Завдання
1.    Значення з регістра DX переписати у два інших регістри.
Розв'язок

CODE SEGMENT
ASSUME CS:CODE, DS:CODE 
    MOV DX, 012H ;записується якась константа в регістр DX, щоб зрозуміло було що переписується
    MOV AX, DX;пересилається слово з DX в AX
    MOV BX, DX;пересилається слово з DX в BX
    MOV DX, 0H ;видалення константи
    int 21h
CODE ENDS

Дальше я буту в цю тему надсилати тільки складні програми (коди).
Кому цікаво де я роблю, то це emu8086
Книга - "Програмування мовою асемблер" ЛНУ імені І.Ф. 2002

Подякували: 0xDADA11C7, leofun012

2 Востаннє редагувалося koala (21.07.2017 09:10:08)

Re: [Асемблер8086]Від нуба до професіонала(або шлях на асемблерну вершину)

17 жовтня 1985 Intel випустив 80386 - свій перший x86-сумісний 32-розрядний процесор.
22 квітня 2003 AMD випустив Opteron - свій перший x86-сумісний 64-розрядний процесор.
Який тепер рік, що ви під 16 біт пишете?

Подякували: Betterthanyou, FakiNyan, /KIT\3

3

Re: [Асемблер8086]Від нуба до професіонала(або шлях на асемблерну вершину)

я тільки починаю, я раніше писав програми на MASM32, але це дуже складно (я просто переписував код по аналогії), тому на мій погляд легше буде вивчити Асемблер під 8086, і потім перейти на сучасні процесори, але вже з базовими знаннями асемблера.

Подякували: 0x9111A1

4

Re: [Асемблер8086]Від нуба до професіонала(або шлях на асемблерну вершину)

Додати три числа: 10, -25, 2

CODE SEGMENT
ASSUME CS:CODE, DS:DATA   
    MOV BX, 2D
    MOV AX, 10
    ADD AX, BX
    MOV BX, -25D
    ADD AX, BX 
    int 21h
CODE ENDS

Результат AX=FF:F3, Sign flag = 1
можна переконатися в правильності виконання обрахунків використавши команду NEG яка замінить знак, або перевірити на калькуляторі

5 Востаннє редагувалося koala (21.07.2017 09:46:58)

Re: [Асемблер8086]Від нуба до професіонала(або шлях на асемблерну вершину)

1. Ви додаєте до деяких чисел суфікс D (це означає "decimal", правильно), а до деяких - ні. Це заплутує: числа в рядках 3 і 4 виглядають як 20 і 10, але насправді в 3 2D; може, будете писати d маленьке чи взагалі пропускати?
2. ADD (як і MOV) може приймати другий операнд як одразу заданий:

MOV AX, 2
ADD AX, 10
ADD AX, -25
Подякували: Betterthanyou, leofun012

6 Востаннє редагувалося Betterthanyou (21.07.2017 09:52:58)

Re: [Асемблер8086]Від нуба до професіонала(або шлях на асемблерну вершину)

Завдання
Додати чотири однобайтові змінні: X1, R1, A1, D1

ASSUME CS:CODE, DS:DATA
DATA SEGMENT
    X1 DD 2d
    R2 DD 2d
    A3 DD 2d
    D4 DD 2d
DATA ENDS

CODE SEGMENT
   
    MOV AX, X1
    ADD AX, R2
    ADD AX, A3
    ADD AX, D4
    int 21h
CODE ENDS

Чому в мене X1 = 44H ?(рядок 3, X1 DD 2d)

7

Re: [Асемблер8086]Від нуба до професіонала(або шлях на асемблерну вершину)

А де ви DS встановлюєте?

Подякували: Betterthanyou1

8

Re: [Асемблер8086]Від нуба до професіонала(або шлях на асемблерну вершину)

Додати чотири однобайтові змінні: X1, R1, A1, D1

Сміх і гріх - ваші змінні чотирибайтові, а регістри двобайтові.

Подякували: koala, Betterthanyou, leofun013

9

Re: [Асемблер8086]Від нуба до професіонала(або шлях на асемблерну вершину)

Це так, але це не має давати такого результату. Просто братиме нижні байти.

Подякували: Betterthanyou1

10

Re: [Асемблер8086]Від нуба до професіонала(або шлях на асемблерну вершину)

Значить дійсно DS десь гуляє.

Подякували: Betterthanyou1

11

Re: [Асемблер8086]Від нуба до професіонала(або шлях на асемблерну вершину)

Betterthanyou
Викладайте опції компілера з якими ви вкомпілюєте, бо и не знаємо на що перетворюється ваш джерельний код - на ехе чи ком файл.

Подякували: Betterthanyou, leofun012

12

Re: [Асемблер8086]Від нуба до професіонала(або шлях на асемблерну вершину)

І що має робити int 21h складно уявити навіть

Подякували: Betterthanyou1

13 Востаннє редагувалося koala (21.07.2017 11:27:51)

Re: [Асемблер8086]Від нуба до професіонала(або шлях на асемблерну вершину)

0xDADA11C7 написав:

І що має робити int 21h складно уявити навіть

Оскільки, якби все спрацювало, в AH був би 0 - то це завершення роботи.

Подякували: Betterthanyou1

14

Re: [Асемблер8086]Від нуба до професіонала(або шлях на асемблерну вершину)

Ви хотіли сказати - якби кодер перед додаванням попередньо б очистив регістр ax й його старшу частину зокрема, то там мало бути 0? Бо на початку роботи значення регістрів рандомні.

Подякували: koala, Betterthanyou2

15

Re: [Асемблер8086]Від нуба до професіонала(або шлях на асемблерну вершину)

А яким чином там збережеться попереднє значення після команди

MOV AX, X1
Подякували: Betterthanyou1

16

Re: [Асемблер8086]Від нуба до професіонала(або шлях на асемблерну вершину)

Я не знаю як в 8086 - давно не працював в ньому, але в AI-32 зчитування байту в регістр AX можна зробити декількома шляхами
movzx ax, Byte Ptr [X1] або mov al, [X1]. Ну або ж lodsb. Але ж про movzx тут мова не йде.

Подякували: Betterthanyou1

17

Re: [Асемблер8086]Від нуба до професіонала(або шлях на асемблерну вершину)

Хм, якщо я роблю COM програму

org 100h

MOV AL, X1 
ADD AL, R2
ADD AL, A3
ADD AL, D4
INT 20H
ret
X1 DB 2d
R2 DB 2d
A3 DB 2d
D4 DB 2d  
end

то тут все працює нормально, за виключенням того що після ret ідуть команди, я не знаю чому
https://replace.org.ua/extensions/om_images/img/5972de3f1a91d/Untitled.png

Якщо створювати EXE програму так як я робив це раніше (мається на увазі шаблон)

ASSUME CS:CODE, DS:DATA
DATA SEGMENT
    X1 DB 2d
    R2 DB 2d
    A3 DB 2d
    D4 DB 2d 
DATA ENDS
 
CODE SEGMENT
   
    MOV AL, X1 
    ADD AL, R2
    ADD AL, A3
    ADD AL, D4
    INT 20H
CODE ENDS

то в X1 з'являється 01Ah
https://replace.org.ua/extensions/om_images/img/5972de3f1a91d/2_Untitled.png

Якщо використовувати той шаблон що пропонує редактор Асемблер8086

такий шаблон пропонує
; multi-segment executable file template.

data segment
    ; add your data here!
    pkey db "press any key...$"
ends

stack segment
    dw   128  dup(0)
ends

code segment
start:
; set segment registers:
    mov ax, data
    mov ds, ax
    mov es, ax

    ; add your code here
            
    lea dx, pkey
    mov ah, 9
    int 21h        ; output string at ds:dx
    
    ; wait for any key....    
    mov ah, 1
    int 21h
    
    mov ax, 4c00h ; exit to operating system.
    int 21h    
ends

end start ; set entry point and stop the assembler.

то все одно програма працює не так,

data segment
    X1 DB 2d
    R2 DB 2d
    A3 DB 2d
    D4 DB 2d 
ends

code segment
start:
; set segment registers:
    MOV AL, X1 
    ADD AL, R2
    ADD AL, A3
    ADD AL, D4      
    mov ax, 4c00h ; exit to operating system.
    int 21h    
ends
end start ; set entry point and stop the assembler.

https://replace.org.ua/extensions/om_images/img/5972de3f1a91d/3_Untitled.png
в регістр AL записується CD замість 02, чому ?

18 Востаннє редагувалося koala (22.07.2017 07:49:51)

Re: [Асемблер8086]Від нуба до професіонала(або шлях на асемблерну вершину)

Betterthanyou написав:

після ret ідуть команди, я не знаю чому

Процесор не вміє розрізняти команди і дані. Оці ваші DD він читає як команди і показує їх (точніше, емулятор показує, як буде їх читати процесор).

Betterthanyou написав:

Якщо використовувати той шаблон що пропонує редактор

Так використовуйте шаблон, а не замінюйте його своїм кодом. Там недарма рядки 15-16 є. І коментар до них у рядку 14. Про що я вже питав. Будь ласка, не ігноруйте питання, які вам ставлять. Принаймні, якщо хочете пройти шлях від нуба до професіонала.

Подякували: Betterthanyou1

19

Re: [Асемблер8086]Від нуба до професіонала(або шлях на асемблерну вершину)

Завдання
Задано три однобайтові змінні. Зменшити їхні значення на 1 трьома різними способами.

Перший і другий спосіб я здогадався, це може бути декремент (команда DEC) і віднімання (команда SUB). Але який може бути третій спосіб ?

20

Re: [Асемблер8086]Від нуба до професіонала(або шлях на асемблерну вершину)

Я вам 100500 спообів наведу, тіки не всі вам зарахуються в якості відповідей. По-перше додавати можна як в пам'ять, так і в регістри, по-друге існує 100500 математичних способів зробити це - найпростіше це додати та відняти -1.

Подякували: koala, Betterthanyou2