Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Запись значения по адресу


Автор: AlexST 11.12.2006, 14:27
Ребят, помогите разобраться.
Ввожу в строчку fam фамилию, например "Быков" (без кавычек).
Хочу затереть пробелом оставшийся в строке #13. Он стоит на 7 позиции, т. е. fam+7 его адрес.
Имя самой строки sf. Её размер rf.

Код

.model    small    
.stack    100h    
.code
start:  mov    ax,DGROUP
    mov    ds,ax    ; помещается в DS
    mov    es,ax

    mov    ah,0
    mov    al,3
    int    10h 

    mov    dl,5 ;ввод фамилии
    mov    dh,5
    call    pk
    mov    dx,offset fam
    mov    ah,0ah
    int    21h 

    ;затираем
    
         
    mov    [fam+7],' '; тут проблема

    mov    al,fam+7;печатаем 8 или 7 бит
    mov    ah,0
    call    decas;процедура перевода числа в строку- смотрим код символа

    mov    dl,1
    mov    dh,18
    call    pk
    lea    dx,asc+2
    mov    ah,9
    int    21h 

    mov    ah,08h
    int    21h 
    mov    ax,4C00h
    int    21h    

pk    proc ;dh,dl
    mov    ah,2
    mov    bh,0
    int    10h
    ret
pk    endp
decas    proc ; ax,10
    mov    cx,10
    lea    si,s-1
    mov    [si+1],' '
    mov    [si+2],' '
    mov    [si+3],' '
    mov    [si+4],' '
    mov    bx,5
b:    cmp    ax,10
    jb    e
    mov    dx,0
    div    cx
    or    dl,30h
    mov    [si+bx],dl
    dec    bx
    jmp    b
e:    or    al,30h
    mov    [si+bx],al
    ret
decas    endp
.data
s2    db      "Введите вашу фамилию:$"
s1    db      "Введите ваш номер:$"
s3    db      "Пароль не верен$"
s4    db      "Пароль верен$"
pas  label    byte
mp   db    2
rp    db    ?
sp    db    2 dup (' '),'$'
fam    label    byte
mf    db    11
rf     db    ?
sf     db    10 dup (' '),'$'
asc    label    byte
m     db    10
r      db    ?
s     db    10 dup (' '),'$'
zap    dw    5
mn    dw    1
vch    dw    0
hand    dw    ?
cod    db    10 dup (' ')
cod2    db    10 dup (' '),'$'
adr    db    "d.txt",0
buf    db    10 dup (' '),'$' 
bufr1    dw    ?
bufr2    dw    ?
bufr3    dw    ?
seed    dw    ?
srand    db    10 dup (' '),'$'
pass    db    10 dup (' '),'$'
    end    start



Так вот, если я пишу mov [fam+7],' ' - то всё нормально.
А если:

Код

    lea    si,fam
    add    si,7
    mov    [si],' '

или
Код

    lea    bx,sf
    mov    al,rf
    mov   ah,0
    mov   si,ax
    mov    [bx+si],' '

ещё как-нибудь. То 8 бите оказывается 0... Откуда он там берётся?  smile 

Автор: sgi1981 11.12.2006, 15:33
Надо уточнять размер непосредственного операнда
Код

mov  byte ptr  [si],' '
;------------
mov byte ptr [bx+si],' '

иначе компилятор воспримет код пробела не как однобайтное число, а как двухбайтное или четырехбайтное.

Автор: AlexST 11.12.2006, 15:41
Спасип.  smile Не подумал.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)