Мелкие детали
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
является более обычной формой для определения буфера!