Приветствую! Я новичок в программировании на ассемблере, поэтому прошу помощи у вас, опытных программистов дзена: посмотрите на следующий код и скажите, как можно его написать по-нормальному (это расплывчатое понятие, но я знаю, что приведенный код может быть написан короче, яснее, эффективнее). Условие: to reverse введенную строку, 16-bit DOS, real-mode Примечание: если количество введенных пользователем символов нечетно, то программа выполняет на один цикл меньше, чем нужно. Я не знаю, как округлять в большую сторону cx при выполнении shr cx, 1. Код (Text): data_seg segment para public message db "Please enter a string", 13, 10, "$" string db 256 dup (?) data_seg ends stack_seg segment para stack db 256 dup (?) stack_seg ends code_seg segment para public main proc assume ds:data_seg, ss:stack_seg, cs:code_seg mov ax, data_seg mov ds, ax mov ax, stack_seg mov ss, ax mov ah, 09h mov dx, offset message int 21h call input call reverse call output mov ah, 4ch int 21h main endp input proc mov ah, 3Fh mov bx, 0000h mov cx, 00FFh mov dx, offset string int 21h ret input endp output proc mov ah, 40h mov bx, 01 mov cx, 00FFh mov dx, offset string int 21h ret output endp reverse proc mov cx, ax shr cx, 1 mov bx, dx add ax, bx dec ax add bx, cx sub ax, cx mov si, ax step: mov dl, byte ptr [bx] xchg dl, byte ptr [si] mov byte ptr [bx], dl dec bx inc si loop step ret reverse endp code_seg ends end main
> "если количество введенных пользователем символов нечетно, то ..." Тут счетчик вообще не нужен: Код (Text): ;dx = offset string, ax - длина lea bx,[dx+ax-1] step: mov al,[dx] mov cl,[bx] mov [bx],al mov [dx],cl inc dx dec bx cmp bx,dx jg step PS: xchg с памятью - страшный тормоз