Специальные функции команд сборки - PullRequest
0 голосов
/ 10 ноября 2019

Я новичок в изучении ассемблера, и мне интересно, что означают эти команды, они не в каком-то конкретном порядке

mov al,[si]
mov [di],al 
inc si
inc di
dec cx
jnz b20
jnz b21
movah 09h`

Заранее спасибо за ваш ответ. Код, который был предоставлен мне:

Page 60,132
. Model small
. Stack 64
.data nom db 'FAUSTINO','$'
ape db 'VAZQUEZ','$'
nomcom db 'ABCDEFGHIJKLMNO','$'
.code
begin proc far
mov ax,@data
mov ds,ax
mov es,ax
mov cx,08
lea si,nom
lea di,
nomcom
b20:
mov al,[si]
mov [di],al
inc si
inc di
dec cx
jnz b20
mov cx,07
lea si,ape
b21:
mov al,[si]
mov [di],al
Inc si
Inc di
Dec cx
Jnz b21
mov ah, 09h ;
Lea dx, nomcom ;
mov ax, 4c00h
int 21h
begin endp
end begin

1 Ответ

0 голосов
/ 14 ноября 2019

Мелкие детали

mov al,[si] считывает один байт из памяти, используя адрес, сохраненный в регистре SI.

mov [di],al записывает один байт в память, используя адрес, сохраненный в регистре DI.

inc si увеличивает адрес источника на 1.

inc diувеличивает адрес получателя на 1.

dec cx понижает счетчик цикла на 1.

jnz b20 продолжает цикл до тех пор, пока счетчик цикла не упал до нуля.

Общая картина

.data
nom db 'FAUSTINO','$'
ape db 'VAZQUEZ','$'
nomcom db 'ABCDEFGHIJKLMNO','$'

Учитывая приведенные выше определения данных и настройку регистров SI, DI и CX, программа сначала копирует 8-символьный текст "FAUSTINO" поверх текста "ABCDEFGH", а затем копирует 7-символьный текст "VAZQUEZ" поверх текста "IJKLMNO". Поскольку все удобно, буфер назначения в nomcom теперь содержит «FAUSTINOVAZQUEZ $». Это имеет правильный формат для отправки в функцию DOS.PrintString 09h. К сожалению, ваша программа пропускает необходимую инструкцию int 21h, поэтому программа завершает работу, прежде чем выводить объединенный результат.

    mov cx, 8       ; Length of the text "FAUSTINO"
    lea si, nom     ; Address of the text "FAUSTINO"
    lea di, nomcom  ; Address of destination buffer
b20:
    mov al, [si]
    mov [di], al
    inc si
    inc di
    dec cx
    jnz b20

    mov cx, 7       ; Length of the text "VAZQUEZ"
    lea si, ape     ; Address of the text "VAZQUEZ"
b21:
    mov al, [si]
    mov [di], al
    inc si
    inc di
    dec cx
    jnz b21

    mov ah, 09h     ; DOS.PrintString
    lea dx, nomcom
    int 21h
    mov ax, 4C00h   ; DOS.Terminate
    int 21h

Исходное содержимое в буфере на nomcom не имеет значения, кромедля 16-го байта, который содержит терминатор строки DOS "$".
Определение данных для nomcom можно было бы записать в виде:

nomcom db 15 dup (0), '$'

Программа выполнила бы толькотакой же. Однако использование оператора dup является более обычной формой для определения буфера!

...