Добавить 0 к концу строки - Assembler
Формулировка задачи:
Доброго времени суток!
Разбираюсь в ассемблере. Столкнулся с такой задачей, нужно открыть файл для записи и записать туда результат вычислений. Я начал с малого: запрос пути, и открытие файла для записи. Для функции 3Dh нужно чтобы в конце строки пути был 0, насколько я понял, подскажите пожалуйста, как это сделать? Конструктивная критика приветствуется, желание самоутвердиться за счет того, что больше знаешь, порицается)
.model small .stack .data mess db 'Enter string: $' ;приглашение ввода пути F_Name_IN db 100 dup ('0') ;буфер, в который записываем строку errr db 'error! $' .code start: mov ax, @data mov ds, ax lea dx, mess ;Приглашение ввода mov ah, 9 int 21h lea dx, F_Name_IN ;Чтение строки в буфер mov ah, 0ah int 21h jmp open_file open_file: mov cx, 0 mov ah,3dh ;функция DOS для открытия файла, чтение-запись mov al, 02h lea dx, F_Name_IN int 21h jc error error: lea dx, errr ;ошибка mov ah, 9 int 21h jmp ext_DOS ;выход из DOS ext_DOS: mov ah, 4ch int 21h end start
Решение задачи: «Добавить 0 к концу строки»
textual
Листинг программы
lea si, bcd_chisl+9 lea di,buffer mov dx,di mov cx,10 @@: mov al,[si] test al,al jnz @f dec si dec cx jnz @b inc si inc cx @@: mov al,[si] db 0d4h,16 or ax,3030h rol ax,8 dec si stosw loop @b cmp buffer,'0' jnz @f inc dx
Объяснение кода листинга программы
- lea si, bcd_chisl+9 - в данном случае переменная bcd_chisl представляет собой строку, а 9 - это смещение в этой строке. Таким образом, значение переменной si будет указывать на 9-й символ строки bcd_chisl.
- lea di,buffer - здесь buffer является переменной, в которую будет записан результат.
- mov dx,di - dx также используется в операции записи, и его значение будет равно значению di.
- mov cx,10 - cx представляет собой счётчик, который будет использован для перебора символов в строке.
- mov al,[si] - mov al,09h - здесь al представляет собой байт, который будет содержать значение 9.
- test al,al - это проверка на неравенство al нулю.
- jnz @f - если al не равен нулю, то происходит переход к метке @f.
- dec si - если al равен нулю, то происходит уменьшение значения si на единицу.
- dec cx - уменьшение значения cx на единицу.
- jnz @b - если значение cx не равно нулю, то происходит переход к метке @b.
- inc si - увеличение значения si на единицу.
- inc cx - увеличение значения cx на единицу.
- mov al,[si] - mov al,0d4h - здесь al будет содержать значение 0d4h (132 в десятичной системе).
- db 0d4h,16 - здесь 0d4h представляет собой число, а 16 - это ASCII коды символа, который будет добавлен к строке.
- or ax,3030h - здесь ax представляет собой значение, которое будет оромовано с 3030h.
- rol ax,8 - это операция оротации (сдвига) значения ax на 8 позиций вправо.
- dec si - уменьшение значения si на единицу.
- stosw - это запись значения dx в буфер с последующим увеличением его на единицу.
- loop @b - это переход к метке @b до тех пор, пока значение cx не станет равным нулю.
- cmp buffer,'0' - сравнение значения буфера со значением '0'.
- jnz @f - если буфер не равен '0', то происходит переход к метке @f.
- inc dx - увеличение значения dx на единицу.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д