В заданой строке с нулевым завершителем поменять символы каждой пары местами - Assembler

Узнай цену своей работы

Формулировка задачи:

Помогите исправить код или составить алгоритм. Этот выдает ошибки.
.386 
.model flat,stdcall 
.data 
string db "0123456789abcdefghjrowommfwmf",0 
.code 
start: 
lea esi,string 
mov ecx,0ffffffffh 
lop: 
lodsw ;получаем два символа строки (два байта) приэтом esi увеличивается на 2 
cmp ax,0 ; проверяем конец строки.. . если ноль закругляемся.. . 
je FINISH 
ror ax,8 ;меняем местами 
mov ds:[esi-2],ax : записываем обратно 
loop lop ; повтор 
FINISH: 
ret 
end start

Решение задачи: «В заданой строке с нулевым завершителем поменять символы каждой пары местами»

textual
Листинг программы
;MASM
STR_SZ  = 256
.586
.model  flat, stdcall
option  casemap :none       ; case sensitive
    include \masm32\include\windows.inc
    include \masm32\include\masm32.inc
    include \masm32\include\msvcrt.inc
    include \masm32\macros\macros.asm
    includelib  \masm32\lib\masm32.lib
    includelib  \masm32\lib\msvcrt.lib
 
.data
req db  'Enter string[256]:',0
res db  'Res: %s',0
tps db  '%s',0
.data?
pstr    dd  ?
psub    dd  ?
.code
 
start:
    invoke  crt_malloc, STR_SZ  ; память под строку
    mov [pstr], eax
    mov esi, eax        ; сразу "ложим" в ESI
    invoke  crt_malloc, STR_SZ  ; память под буффер
    mov [psub], eax
    mov edi, eax        ; сразу "ложим" в EDI
    invoke  crt_printf, ADDR tps, ADDR req  ; запрос
    invoke  crt_gets, [pstr]    ; ввод строки
    invoke  crt_strlen, [pstr]  ; вычисляем длину
    xor ebp, ebp        ; обнуляем флаг
    sar eax,1           ; длина строки/пополам
    adc ebp,0           ; если длина нечётная, то EBP=1
    mov ecx,eax         ; счётчик
@@: lodsw               ; грузим 2 байта
    xchg    al,ah           ; меняем местами
    stosw               ; сохраняем
    loop    @B          ; ECX раз
    or  ebp,ebp         ;; если длина нечётная, то...
    jz  @F          ; чётная, пропускаем
    lodsb               ;; ... дописываем последний байт
    stosb                           ;;
@@: xor al,al                   ; завершающий...
    stosb                           ;... нолик
    invoke  crt_printf, ADDR res, [psub]    ; выводим результат
    invoke  crt__getch      ; press <ANY KEY>
    invoke  crt_free,[pstr]     ;; освобождаем
    invoke  crt_free,[psub]     ;; память
    invoke  crt_exit,0      ; финита ля трагедиа
    end start

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.867 из 5
Похожие ответы