Добавить 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

Объяснение кода листинга программы

  1. lea si, bcd_chisl+9 - в данном случае переменная bcd_chisl представляет собой строку, а 9 - это смещение в этой строке. Таким образом, значение переменной si будет указывать на 9-й символ строки bcd_chisl.
  2. lea di,buffer - здесь buffer является переменной, в которую будет записан результат.
  3. mov dx,di - dx также используется в операции записи, и его значение будет равно значению di.
  4. mov cx,10 - cx представляет собой счётчик, который будет использован для перебора символов в строке.
  5. mov al,[si] - mov al,09h - здесь al представляет собой байт, который будет содержать значение 9.
  6. test al,al - это проверка на неравенство al нулю.
  7. jnz @f - если al не равен нулю, то происходит переход к метке @f.
  8. dec si - если al равен нулю, то происходит уменьшение значения si на единицу.
  9. dec cx - уменьшение значения cx на единицу.
  10. jnz @b - если значение cx не равно нулю, то происходит переход к метке @b.
  11. inc si - увеличение значения si на единицу.
  12. inc cx - увеличение значения cx на единицу.
  13. mov al,[si] - mov al,0d4h - здесь al будет содержать значение 0d4h (132 в десятичной системе).
  14. db 0d4h,16 - здесь 0d4h представляет собой число, а 16 - это ASCII коды символа, который будет добавлен к строке.
  15. or ax,3030h - здесь ax представляет собой значение, которое будет оромовано с 3030h.
  16. rol ax,8 - это операция оротации (сдвига) значения ax на 8 позиций вправо.
  17. dec si - уменьшение значения si на единицу.
  18. stosw - это запись значения dx в буфер с последующим увеличением его на единицу.
  19. loop @b - это переход к метке @b до тех пор, пока значение cx не станет равным нулю.
  20. cmp buffer,'0' - сравнение значения буфера со значением '0'.
  21. jnz @f - если буфер не равен '0', то происходит переход к метке @f.
  22. inc dx - увеличение значения dx на единицу.

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


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

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

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