Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа со строками (assembler)

31K
06 апреля 2008 года
snoop_lan
11 / / 05.04.2008
Привет всем!!!
Помогите наити ошибку в коде! суть такова "дана строка Sn. с n- елементами : если введены только цифры выводить 1, в противном случее 0"
Не происходит вызов процидуры :number_str

вод код:


Код:
;------------opisem segments komand-----------------------------------------------
  code segment
  assume cs:code,ds:data
 
 main proc
    mov ax,data                        ;initalizatiea
    mov ds,ax                          ;registra ds

;-----------------------begin program---------------------------------------------

call number_str
                           ;****vivod slujebnogo soobsenie***
    mov ah,09h                         ;functiea vivoda
    mov dx,offset msg                 ;adres soobseniea
    int 21h
    push cx
                       
    mov cx,num                            
    mov bx,offset buf
Mloop:
    mov ah,1
    int 21h
     
    mov [bx],al
    inc bx
loop Mloop
    pop cx
       
 call point
 call proc0_1
   
;-------------------------end of program------------------------------------------

EXIT:

    mov ah,01                          ;ostanovka programmi
    int 21h                            ;v ojidanii najatiea klavisi
           ;zaversenie programmi
    mov ax,4c00h
    int 21h

main endp
;------------------SIMVOL-----------------------------
point proc
    push ax
    push si
    push cx
   
    mov ax,offset buf    
;***sohraneaem stroku
    mov act,ax                         ;facticeski vvedeno
;****proverim esti li v stroke krome tifirii esio kakieto simvoli
    mov cx,act                         ;dlena vvedionnoi stroki
    mov si,0                           ;ukazateli v buffer
   
    pop cx
    pop si
    pop ax
ret
point endp
;------------------SIMVOL END-------------------------------
;--------------procedura preobrazovaniea stroki v cislo--------
number_str proc
    push ax
    push bx
    push cx
    push dx
    push si
mov es,ax
    mov ah,9
    mov dx,offset msg0
    int 21h

    mov ah,0ah
    lea dx,maxl
    int 21h

    mov bx,offset str_1-1
    xor ah,ah
    mov al,arl
    mov si,ax
m:
    mov al,[bx+si]
    sub al,30h
    xor dx,dx
    mul m10
    add num,ax
    dec si
    mov ax,10
    mul m10
    mov m10,ax
    cmp si,0
    jne m
 cld
    pop si
    pop dx
    pop cx
    pop bx
    pop ax  
RETN
number_str endp
;--------------konet proteduri---------------------------------
;-----------------functiea proverki susestvuet le v strok.simvoli krome cisel----
proc0_1 proc
    push ax
    push si
    push dx
   
    mov al,buf[si]         ;vozmiom simvol
    cmp al,'9'             ;menise 9?
    jbe one                 ;da  perehod na sleduiusii simvol
    cmp al,'9'             ;bolise 9?
    ja null                ;perehod na Exit of program
null:
    mov ah,09h              ;funktiea vivoda
    mov dx,offset msg1     ;adres soobseniea
    int 21h
    jmp EXIT
one:
    inc si                    ;smestim ukazateli
    loop proc0_1                ;tikl po vsem simvolam
     
    mov ah,09h                ;functiea vivoda
    mov dx,offset msg2       ;adres soobseniea
    int 21h
   
    pop dx
    pop si
    pop ax    
ret  
proc0_1 endp
;---------------------------    
code ends                  ;konet segmenta koda

;----------------------------opisim segment dannih--------------------------------
data segment
  msg0 db "vvedite razmernosti stroki Sn,N=$"
  msg db "vvedite stroku!$"
  msg1 db 10,13,"0",'$'
  msg2 db 10,13,"1",'$'
  buf db 100 dup('')                  ;buffer vvoda
  act   dw 0
  ns db  10,13,'$'
       maxl db 6
       arl db 6
       str_1 db 6 dup('?')
    num dw 0
    m10 dw 1
 
data ends
;-----------------------------opisem segment steka--------------------------------
  stk segment stack
  dw 128 dup('')
  stk ends
end main


:confused:
33K
06 апреля 2008 года
ACW-Coder
17 / / 02.01.2008
Может я чего-то не понимаю в условии задачи, но тебя такой вариант случаем не устроит?

Код:
.386
.model flat, STDCALL
.data
    strTest db "128, Hello, world!", 0
    ;...
.code
start:

    lea esi, strTest    ; адрес строки
@@: mov al, [esi]   ; получение символа
    cmp al, '0'     ; сравнение с 0
    jb  out0        ; если меньше, то на вывод '0'
    cmp al, '9'     ; сравнение с 9
    ja  out0        ; если больше, то на вывод '0'
    inc esi     ; увеличить указатель
    or  al, 0       ; сравнить считанный символ с 0
    jne @B      ; если не 0, значит строка не обработана

    ;вывод единицы
    ;...

    jmp @F
out0:
    ;вывод нуля
    ;...
@@:
    ;конец
    ;...

    ret
end start
31K
06 апреля 2008 года
snoop_lan
11 / / 05.04.2008
Цитата: ACW-Coder
Может я чего-то не понимаю в условии задачи, но тебя такой вариант случаем не устроит?

Код:
.386
.model flat, STDCALL
.data
    strTest db "128, Hello, world!", 0
    ;...
.code
start:

    lea esi, strTest    ; адрес строки
@@: mov al, [esi]   ; получение символа
    cmp al, '0'     ; сравнение с 0
    jb  out0        ; если меньше, то на вывод '0'
    cmp al, '9'     ; сравнение с 9
    ja  out0        ; если больше, то на вывод '0'
    inc esi     ; увеличить указатель
    or  al, 0       ; сравнить считанный символ с 0
    jne @B      ; если не 0, значит строка не обработана

    ;вывод единицы
    ;...

    jmp @F
out0:
    ;вывод нуля
    ;...
@@:
    ;конец
    ;...

    ret
end start


привет !
Слуш мне надо компелировать на tasm,
и в проге надо считтывать с клавиатуры число (n) и также считать с клавиатуры строку размерности (n)!!!
У меня не работает проц. считывания с клавиатуры число (n)??

33K
06 апреля 2008 года
ACW-Coder
17 / / 02.01.2008
Короче, я не знаю почему она у тебя не вызывается, и разбираться не особо тянет, но вот, что получилось у меня (в действии программа не очень красиво выглядит, но я думаю, что это не проблема):
Код:
masm
.model  small
;********************************************************************
.data
;********************************************************************
    strNumber   db 8 dup(0)
    strMessage  db 256 dup (0)
    dwNumber    dw 0
;********************************************************************
.code
;********************************************************************
fnReadNumber    PROC

    mov ah, 0ah         ;считывание строки
    lea dx, strNumber       ;адрес приемника
    mov bx, dx          ;копирование адреса
    mov byte ptr [bx], 5    ;[+0] = кол-во символов
    int 21h         ;прерывание

    ;Вычисление адреса последнего символа
    mov cx, dx     
    add cl, [bx + 1]        ;адрес + длина
    adc ch, 0           ;+СF
    add cx, 1           ;+2 (служебная информация)
                    ;-1 (индексирование с нуля)

    mov di, bx          ;адрес начала
    add di, 2
    mov bx, 1           ;первый множитель
    mov dwNumber, 0     ;результат = 0

LP_GET_NUMBER:
    mov si, cx
    xor ax, ax
    mov al, [si]        ;чтение символа
    sub al, '0'         ;преобразование в число
    mul bx          ;учет позиции цифры
    add dwNumber, ax        ;вычисление суммы с результатом

    mov ax, bx          ;корректировка
    mov dx, 10          ; множителя
    mul dx
    mov bx, ax

    dec cx
    cmp cx, di          ; сравнение с адресом начала
    jae LP_GET_NUMBER

    ret
fnReadNumber    ENDP
;********************************************************************
start:

    mov ax, @data
    mov ds, ax
    mov ax, @stack
    mov ss, ax

    call    fnReadNumber   

    mov ah, 3fh         ;чтение строки
    mov bx, 0
    mov cx, dwNumber
    lea dx, strMessage 
    int 21h

    mov si, dx          ; адрес строки
lpTest: mov al, [si]        ; получение символа
    or  al, 0           ; сравнить считанный символ с 0
    je  lpEnd           ; если не 0, значит строка не обработана
    cmp al, '0'         ; сравнение с 0
    jb  out0            ; если меньше, то на вывод '0'
    cmp al, '9'         ; сравнение с 9
    ja  out0            ; если больше, то на вывод '0'
    inc si          ; увеличить указатель
    jmp lpTest
lpEnd:
    ;вывод единицы
    mov dl, '1'
    jmp OnExit
out0:
    ;вывод нуля
    mov dl, '0'
OnExit:
    mov ah, 02h
    int 21h

    ;конец

    mov ah, 01h
    int 21h

    mov ah, 4ch
    int 21h

    ret
end start
;********************************************************************
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог