03.02.2009, 00:32
общий
это ответ
Здравствуйте, Artem--ua!
Программа в приложении.
Чтобы сохранить "признак чётности/нечётности элементов строки для её второй половины",
высчитываем длину первой половины такой, чтобы она была четной
Приложение:
;tasm copy.asm
;tlink copy /t
;Копируем вторую половину строки (по адресу в AX) в буфер (по адресу BX)
;Первая половина имеет четное число байт,
;чтобы сохранить "признак чётности/нечётности" для второй половины
.model tiny
.data
sFirst db 'Before: ',0
sSecond db 0dh, 0ah,'After : ',0
string db '123456789',0
second db 5 dup (?)
.code
.startup
lea ax, string
lea bx, second
call CopySecondPart
lea si, sFirst
call PrintASCIIZ
lea si, string
call PrintASCIIZ
lea si, sSecond
call PrintASCIIZ
lea si, second
call PrintASCIIZ
mov ax, 4c00h
int 21h
CopySecondPart proc
mov si, ax ;адрес строки
mov di, ax
mov al, 0
mov cx, 0ffffh
repne scasb ;ищем конечный 0
lea ax, [di-1] ;адрес конечного 0
sub ax, si ;длина строки
shr ax, 1 ;половина длины строки
and ax, 0fffeh ;вторая половина на границе слова
add si, ax ;адрес второй половины
CLoop: ;копируем, включая завершающий 0
lodsb
mov [bx], al ;адрес выходного буфеа
inc bx
cmp al, 0
jne CLoop
ret
CopySecondPart endp
PrintASCIIZ proc ;вывод на экран ASCIIZ строки
lodsb
cmp al, 0
jz PARet
int 29h
jmp PrintASCIIZ
PARet:
ret
PrintASCIIZ endp
end
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен