2013-10-24 3 views
1

Я хочу сделать две вещи:
1) принимает строку из пользователя
2) Найдите длину этой строкиДлина входной строки на языке ассемблера

Я попытался следующий код:

.model small  
.stack 100h 
.data 
    MAXLEN DB 100 
    ACT_LEN DB 0    ;Actual length of the string 
    ACT_DATA DB 100 DUP('$') ;String will be stored in ACT_DATA 
    MSG1 DB 10,13,'ENTER STRING : $' 
.CODE 
START: 
    MOV AX,@data 
    MOV DS,AX 
    ;Normal printing 
    LEA DX,MSG1 
    MOV AH,09H 
    INT 21H 
    ;Cant understand code from here! 
    LEA DX,ACT_DATA 
    MOV AH,0AH 
    MOV DX,OFFSET MAXLEN 
    INT 21H 

    LEA SI,ACT_DATA 
    MOV CL,ACT_LEN 

    ;AND THEH SOME OPERATIONS 

END START 

Но я смущен тем, как длина сохраняется в регистре CL, т. Е. Как увеличивается значение ACT_LEN? А что на самом деле mov AH,0A имеет отношение к длине?

ответ

3

Int 21/AH=0Ah

Format of DOS input buffer: 

Offset Size Description  (Table 01344) 
00h BYTE maximum characters buffer can hold (MAXLEN) 
01h BYTE (call) number of chars from last input which may be recalled (ACT_LEN) 
(ret) number of characters actually read, excluding CR 
02h N BYTEs actual characters read, including the final carriage return (ACT_DATA) 

Прерывание ввода буферного заполнит эти значения.

LEA DX,ACT_DATA 
MOV AH,0AH 
MOV DX,OFFSET MAXLEN 
INT 21H 

Вам не нужно LEA DX,ACT_DATA

mov AH,0A это число прерываний для вызова. Ralph Brown has a big list прерываний с описаниями и что входит/выходит.

+2

Как изменить значение ACT_LEN.Пожалуйста, сделайте это! Все ли сделано командой MOV AH, 0Ah на смещение 01h ?? –

Смежные вопросы