tasm

Тема в разделе "WASM.BEGINNERS", создана пользователем XshStasX, 18 дек 2010.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Код в студии
    Код (Text):
    1. .286
    2. ;.model flat,stdcall
    3. StackSg    SEGMENT  Stack
    4.  
    5.      
    6. StackSg    ENDS
    7.  
    8. DataSG     SEGMENT  PARA  'data'
    9.    
    10.  
    11. STACK_ STRUC
    12.     first dw ?
    13.     cur   dw ?
    14.     last  dw ?
    15. STACK_ ends
    16.  
    17.     MYSTACK STACK_ ?
    18.      MemForStack dw 1024 dup(0)  
    19.      temp dw 3;
    20.  
    21.    
    22. DataSG     ENDS
    23.  
    24. CodeSg     SEGMENT  PARA 'code'
    25.    
    26.  ASSUME    CS: CodeSg, DS: DataSG, SS: StackSg, ES: Nothing
    27.  
    28.  MAIN PROC
    29.  jmp @START
    30.  
    31.  ;
    32.  ;(DS, ADDRES_STACK,DWORD DATA)
    33.  PUSH_STACK PROC FAR
    34.    push bp
    35.    mov bp,sp
    36.    push ds
    37.    push ax
    38.    push  cx
    39.    push dx
    40.    
    41.    mov ds,[bp+0Ah]
    42.    mov dx,[bp+06]
    43.    mov ax,bp
    44.    mov bp,[bp+08]
    45.    
    46.    mov cx,WORD PTR ds:STACK_[bp].last
    47.    cmp WORD PTR ds:STACK_[bp].cur,cx
    48.    jns @L0
    49.    
    50.     mov cx,offset ds:STACK_[bp].cur
    51.     xchg cx,bp
    52.      mov ds:[bp],dx
    53.     xchg  bp,cx
    54.     ;   -   -   -  
    55.     mov cx,ax    
    56.     mov ax,WORD PTR ds:STACK_[bp].cur
    57.     add ax,2
    58.     mov WORD PTR ds:STACK_[bp].cur,ax
    59.     mov ax,cx
    60.     ;   -   -   -   -   -
    61.   @L0:
    62.    mov bp,ax
    63.    
    64.    pop dx
    65.    pop cx
    66.    pop ax
    67.    pop ds  
    68.    pop bp
    69.    ret 6
    70.  PUSH_STACK ENDP
    71.  
    72.  ;
    73.  ;(DS, ADDRES_STACK, VALUE)
    74.   ;(DS, ADDRES_STACK,DWORD DATA)
    75.  POP_STACK PROC FAR
    76.    push bp
    77.    mov bp,sp
    78.    push ds
    79.    push ax
    80.    push  cx
    81.    push dx
    82.    push bx
    83.    
    84.    mov ds,[bp+0Ah]
    85.    mov dx,[bp+06]
    86.    mov ax,bp
    87.    mov bp,[bp+08]
    88.    
    89.    mov cx,WORD PTR ds:STACK_[bp].first
    90.    cmp WORD PTR ds:STACK_[bp].cur,cx
    91.    js @L1
    92.    
    93.    mov bx,bp
    94.    ; ў бе ЇЁиҐвбп  ¤аҐб §­ зҐ­Ёп ў б⥪Ґ  
    95.     mov bp,ds:STACK_[bp].cur
    96.    ;ў cе §­ зҐ­ЁҐ Ё§ б⥪ 
    97.     mov cx,ds:[bp]
    98.    ; ЇЁиҐ¬ §­ зҐ­ЁҐ Ё§ бе, ў  ¤аҐбб Єг¤  ­ ¤® § ЇЁб вм
    99.     mov bp,dx
    100.     mov ds:[bp],cx
    101.    ;ў®бв ­ ў«Ёў Ґ¬ bp, Ё 㬥­ми Ґ¬  STACK_.cur
    102.     mov bp,bx
    103.     mov cx, ds:STACK_[bp].cur
    104.     sub cx,2
    105.     mov WORD PTR ds:STACK_[bp].cur,cx
    106.   @L1:
    107.    mov bp,ax
    108.    
    109.    pop bx
    110.    pop dx
    111.    pop cx
    112.    pop ax
    113.    pop ds  
    114.    pop bp
    115.    ret 6
    116.  POP_STACK ENDP
    117.  
    118.  
    119.  
    120.   @START:
    121.  
    122.    mov MYSTACK.first,offset MemForStack
    123.    mov MYSTACK.cur,offset MemForStack
    124.    mov MYSTACK.last,offset MemForStack
    125.    add MYSTACK.last,255*2
    126.    
    127.  
    128.    push offset ds
    129.    push offset MYSTACK
    130.    push  3
    131.    call PUSH_STACK
    132.  
    133.    push offset ds
    134.    push offset MYSTACK
    135.    push  offset temp
    136.    call POP_STACK
    137.  
    138.  
    139.    push offset ds
    140.    push offset MYSTACK
    141.    push  17
    142.    call PUSH_STACK
    143.    
    144.    push offset ds
    145.    push offset MYSTACK
    146.    push  7
    147.    call PUSH_STACK
    148.    
    149.    push offset ds
    150.    push offset MYSTACK
    151.    push  5
    152.    call PUSH_STACK
    153.  
    154.  
    155.    MOV Ax,4C00H
    156.    INT 21H
    157. MAIN ENDP
    158.  
    159. CodeSG     ENDS
    160. END        MAIN
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Код (Text):
    1. .286
    2. ;.model flat,stdcall
    3. StackSg    SEGMENT  Stack
    4.  
    5. ; << Сюда стоит добавить хотя бы dw 10 dup (?) иначе операции со стеком пойдут тереть PSP программы (т.к. сегмент стека находится в самом начале образа, то перед ним в памяти будет только PSP) и это плохо закончится при ее завершении (это ответ на вопрос про не допустимую операцию после mov ax, 19456/int 33)
    6. StackSg    ENDS
    7.  
    8. DataSG     SEGMENT  PARA  'data'
    9.    
    10.  
    11. STACK_ STRUC
    12.     first dw ?
    13.     cur   dw ?
    14.     last  dw ?
    15. STACK_ ends
    16.  
    17.     MYSTACK STACK_ ?
    18.      MemForStack dw 1024 dup(0)  
    19.      temp dw 3; <<<< Интерестно. Чему будет равно i после следующего выражения if i=3 then i:=i else i:=3;
    20. ; также и у Вас. Чему будет равна переменная temp если она инициализируется значением 3, потом вы в свой стек кладете значение 3 и достается его в эту переменную
    21.  
    22.    
    23. DataSG     ENDS
    24.  
    25. CodeSg     SEGMENT  PARA 'code'
    26.    
    27.  ASSUME    CS: CodeSg, DS: DataSG, SS: StackSg, ES: Nothing
    28.  
    29.  MAIN PROC
    30.  jmp @START; < Чес слово. Так и не понял смысл этого jmp'а. Почему основной код нельзя разместить здесь, а процедуры push и pop вынести за пределы main'а в конец
    31.  
    32.  ;
    33.  ;(DS, ADDRES_STACK,DWORD DATA)
    34.  PUSH_STACK PROC FAR
    35.    push bp
    36.    mov bp,sp
    37.    push ds
    38.    push ax; <<<<<< Вот чес слово. лучше бы вместо сx и dx использовали бы si и di
    39.    push  cx
    40.    push dx
    41.    
    42.    mov ds,[bp+0Ah]
    43.    mov dx,[bp+06];mov ax, [bp+6] - значение
    44.    mov ax,bp; это вообще ни к чему
    45.    mov bp,[bp+08];mov di, [bp+8] - стек
    46.    ; assume di:STACK_
    47.    mov cx,WORD PTR ds:STACK_[bp].last; mov si, [di].cur
    48.    cmp WORD PTR ds:STACK_[bp].cur,cx ;cmp si, [di].last
    49.    jns @L0 ; у вас в стеке еще и указатели знаковые - поздравляю; jc @L0
    50.    
    51.     mov cx,offset ds:STACK_[bp].cur; это не нужно тогда
    52.     xchg cx,bp; и это тоже
    53.      mov ds:[bp],dx; mov [si], ax
    54.     xchg  bp,cx; и это тоже не нужно
    55.     ;     -    -    -    
    56.     mov cx,ax    ; это не нужно. . .
    57.     mov ax,WORD PTR ds:STACK_[bp].cur
    58.     add ax,2
    59.     mov WORD PTR ds:STACK_[bp].cur,ax
    60.     mov ax,cx ; . . .все аж до сих пор. вместо этого просто add [di].cur, 2
    61.     ;    -    -    -    -    -
    62.   @L0:
    63.    mov bp,ax; это вообще ни к чему
    64.    ;assume di:none
    65.    pop dx
    66.    pop cx
    67.    pop ax
    68.    pop ds  
    69.    pop bp
    70.    ret 6
    71.  PUSH_STACK ENDP
    72.  
    73.  ;
    74.  ;(DS, ADDRES_STACK, VALUE)
    75.   ;(DS, ADDRES_STACK,DWORD DATA)
    76.  POP_STACK PROC FAR
    77.    push bp
    78.    mov bp,sp
    79.    push ds
    80.    push ax
    81.    push  cx
    82.    push dx
    83.    push bx
    84.    ; тут те же проблемы что и в push
    85.    mov ds,[bp+0Ah]
    86.    mov dx,[bp+06]; mov si, [bp+6]
    87.    mov ax,bp; не нужно (тоже мне нашли куда bp сохранить)
    88.    mov bp,[bp+08]; mov di, [bp+8]
    89.    
    90.    mov cx,WORD PTR ds:STACK_[bp].first; mov ax, [di].cur
    91.    cmp WORD PTR ds:STACK_[bp].cur,cx ; cmp ax, [di].first
    92.    js @L1; опять знаковые указатели ja @L1
    93.    ; до метки @L1 даже не стал читать. это вообще все лучше переписать
    94.    mov bx,bp
    95.    ; ў бе ЇЁиҐвбп  ¤аҐб §­ 祭Ёп ў б⥪Ґ  
    96.     mov bp,ds:STACK_[bp].cur
    97.    ;ў cе §­ 祭ЁҐ Ё§ б⥪
    98.     mov cx,ds:[bp]
    99.    ; ЇЁиҐ¬ §­ 祭ЁҐ Ё§ бе, ў  ¤аҐбб Єг¤  ­ ¤® § ЇЁб вм
    100.     mov bp,dx
    101.     mov ds:[bp],cx
    102.    ;ў®бв ­ ў«Ёў Ґ¬ bp, Ё 㬥­ми Ґ¬  STACK_.cur
    103.     mov bp,bx
    104.     mov cx, ds:STACK_[bp].cur
    105.     sub cx,2
    106.     mov WORD PTR ds:STACK_[bp].cur,cx
    107. ;push bp
    108. ;mov bp, sp
    109. ;push si
    110. ;push di
    111. ;push ax
    112. ;mov di, [bp+6]
    113. ;mov si, [bp+8]
    114. ;push ds
    115. ;mov ds, [bp+10]
    116. ; assume si:STACK_
    117. ;mov ax, [si].cur
    118. ;cmp [si].first, ax
    119. ;jae @L1
    120. ;sub [si].cur, 2
    121. ;mov si, [si].cur
    122. ;mov ax, [si]
    123. ;pop ds
    124. ;mov [di], ax
    125. ;push ds
    126. ;@L1:
    127. ; assume si:none
    128. ;pop ds
    129. ;pop ax
    130. ;pop di
    131. ;pop si
    132. ;pop bp
    133. ;ret 6
    134. ; сами надеюсь разберетесь
    135.   @L1:
    136.    mov bp,ax
    137.    
    138.    pop bx
    139.    pop dx
    140.    pop cx
    141.    pop ax
    142.    pop ds  
    143.    pop bp
    144.    ret 6
    145.  POP_STACK ENDP
    146.  
    147.  
    148.  
    149.   @START:
    150.  
    151.    mov MYSTACK.first,offset MemForStack
    152.    mov MYSTACK.cur,offset MemForStack
    153.    mov MYSTACK.last,offset MemForStack
    154.    add MYSTACK.last,255*2; <<<<< А нельзя сразу mov MYSTACK.last,offset MemForStack[255], ну или если тасм не догадается умножить 255 на размер word'а, то mov MYSTACK.last,offset MemForStack[255*2]
    155.    
    156.  
    157.    push offset ds                     ; <<< И тасм это проглатывает. интерестно бы узнать, какое значение он туда загоняет или во что это компилируется. Смещение в программе сегментного регистра это весело. Правильнее было бы написать push ds
    158.    push offset MYSTACK
    159.    push  3
    160.    call PUSH_STACK
    161.  
    162.    push offset ds
    163.    push offset MYSTACK
    164.    push  offset temp
    165.    call POP_STACK
    166.  
    167.  
    168.    push offset ds
    169.    push offset MYSTACK
    170.    push  17
    171.    call PUSH_STACK
    172.    
    173.    push offset ds
    174.    push offset MYSTACK
    175.    push  7
    176.    call PUSH_STACK
    177.    
    178.    push offset ds
    179.    push offset MYSTACK
    180.    push  5
    181.    call PUSH_STACK
    182.  
    183.  
    184.    MOV Ax,4C00H
    185.    INT 21H
    186. MAIN ENDP
    187.  
    188. CodeSG     ENDS
    189. END        MAIN
     
  3. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    XshStasX,

    16-битный режим не так богат на варианты употребления базовых/индексных регистров (это тов. krabz верно заметил), как 32/64-битный. По сути вопроса стоит посмотреть табличку 2-1 в подразделе 2.1.5 Intel SDM — там всё про возможности адресации памяти в 16-ти битах показано наглядно (ага, никаких sp).

    То, что пересылка чего-то в ax не меняет старшую часть eax не должно вызывать ни сомнений, ни удивления. Как и то, что с соответствующим(и) префиксами 16-битная инструкция может использовать как 32-битную адресацию, так и 32-битные регистры.