2016-04-28 4 views
2

Wie verwende ich Pusha/Popa in Assembly 8086 mit Tasm Compiler? Ich lese online, dass, weil Pusha und Popa in einer anderen Art von Assembly (.286) sind, ich es nicht verwenden kann, aber es gibt eine Möglichkeit, dem Compiler mitzuteilen, diese Befehle aufzunehmen.Verwenden Sie Pusha und Popa in 8086 mit TASM

Mein Code jetzt:

IDEAL 
MODEL small 
STACK 100h 
DATASEG 
CODESEG 
proc OpenFile 
      push bp 
      mov bp, sp 
      pusha 
      mov dx, [bp + 6] ;Get File Name Offset 
      mov si, [bp + 4] ;Get File Handler 
      mov ah, 3Dh 
      xor al, al 
      int 21h 
      jc openerror 
      mov [word ptr si], ax 
      popa 
      pop bp 
      ret 4 
openerror: lea dx, [ErrorMsg] 
      mov ah, 9h 
      int 21h 
      popa 
      pop bp 
      ret 4 
endp OpenFile 

Der Fehler erhalte ich:

Illegal instruction for currently selected processor(s) 

Hat, wie eine Idee, jemand, das zu tun?

+3

Umm, fügen Sie einfach ' .286' am Anfang Ihrer Datei? Eigentlich im 'IDEAL' Modus, der wahrscheinlich' P286' heißt. – Jester

+0

Ich habe Turbo Assembler seit Jahren nicht mehr gesehen. +1 weil es (ist?) Und genialer Assembler war. 'Pusha' und' Popa' sind I386 Anweisungen IIRC. Sie können es nicht für '8086' verwenden. Ändern Sie Ihr Modell oder fügen Sie die Byte-Codes manuell hinzu. – jww

+0

@Jester Ich kann nicht glauben, dass ich darauf reingefallen bin. Ich habe versucht, die '.286' nach dem IDEAL, nach dem Modell, in den codeseg und dataseg zu setzen, aber ich dachte nicht, dass es der Anfang der Datei sein sollte. Danke, das hat funktioniert! posten Sie eine Antwort – morha13

Antwort

1

schreiben 0,286 in der ersten Zeile der Datei:

.286 
IDEAL 
MODEL small 
STACK 100h 
etc. 

Edit: Ich schrieb Verfahren bereits, dass diese Art der Sache zu tun, hier sind sie:

;CONSTANTS: { 
     ;ACTIONS: { 
      READ   EQU 0 
      WRITE   EQU 1 
      READ&WRITE  EQU 2 ;NOT USABLE AS AN ACTION 
     ;} 

     ;RELATIVE TO: { 
      START_OF_FILE EQU 0 
      CURRENT_POINTER EQU 1 
      END_OF_FILE  EQU 2 
     ;} 
    ;} 

    ;********************************************************************************* 
    ;********************************************************************************* 

    PROC FILE_OPEN 
    ;INPUT: OFFSET OF FILE NAME 
    ;OUTPUT: FILE HANDLE (ALL THATS LEFT IS TO "POP" IT INTO A VARIABLE/REGISTER) 

    ;EXAMPLE: 
     ;PUSH OFFSET FILE_NAME 
     ;CALL FILE_OPEN 
     ;POP [FILE_HANDLE] 

    ;{ 
     ;START_PROC { 
      PUSH BP 
      MOV BP, SP 

      _NAME EQU [WORD PTR BP + 4] 

      PUSH AX BX DX 
     ;} 

     ;CODE{ 
      MOV DX, _NAME 

      MOV AH, 3Dh 
      MOV AL, READ&WRITE 

      INT 21h 
      JC @@END_PROC 

      MOV BX, HANDLE 
      MOV [BX], AX 
     ;} 

     @@END_PROC: ;{ 
      POP DX BX AX 
      POP BP 
      RET 
     ;} 
    ;} 
    ENDP FILE_OPEN 

    ;********************************************************************************* 
    ;********************************************************************************* 

    PROC FILE_READ_OR_WRITE 
    ;{ 
     ;INPUT: READ OR WRITE, FILE HANDLE, BUFFER OFFSET, NUMBER OF BYTES TO READ/WRITE 
     ;OUTPUT: THE DATA IS LOADED FROM THE FILE TO THE BUFFER (IF READ), OR THE DATA IS LOADED FROM THE BUFFER TO THE FILE (WRITE) 

     ;START PROC { 
      PUSH BP 
      MOV BP, SP 

      ACTION EQU [WORD PTR BP + 10] ;READ OR WRITE (CONSTANT) 
      BUFFER EQU [WORD PTR BP + 8]  ;BUFFER OFFSET 
      NUM_BYTES EQU [WORD PTR BP + 6]  ;NUMBER OF BYTES DO LOAD 
      HANDLE EQU [WORD PTR BP + 4]  ;FILE HANDLE 


      PUSH AX BX CX DX 
     ;} 

     ;SET UP PARAMS { 
      MOV BX, HANDLE 
      MOV CX, NUM_BYTES 
      MOV DX, BUFFER 

      CMP ACTION, WRITE 
      JZ @@WRITE 
     ;} 

     @@READ: ;{ 
      MOV AX, 3F00h 
      INT 21h 
      JMP @@END_PROC 
     ;} 

     @@WRITE: ;{ 
      MOV AX, 4000h 
      INT 21h 
     ;} 

     @@END_PROC: ;{ 
      POP DX CX BX AX BP 
      RET 8 
     ;} 
    ;} 
    ENDP FILE_READ_OR_WRITE 

    ;********************************************************************************* 
    ;********************************************************************************* 

    PROC FILE_CLOSE 
    ;INPUT: FILE HANDLE 
    ;OUTPUT: THE FILE IS CLOSED 
    ;{ 
     ;START PROC { 
      PUSH BP 
      MOV BP, SP 
      HANDLE EQU [BP + 4] ;FILE HANDLE 

      PUSH AX BX 
     ;} 

     ;CODE { 
      MOV AH, 3Eh 
      MOV BX, HANDLE 
      INT 21h 
     ;} 

     @@END_PROC: ;{ 
      POP BX AX 
      POP BP 
      RET 2 
     ;} 
    ;} 
    ENDP FILE_CLOSE 

    ;********************************************************************************* 
    ;********************************************************************************* 

    PROC FILE_UPDATE_POINTER 
    ;INPUT: RELATIVE_TO(MOVING THE POINTER RELATIVE TO [START_OF_FILE, CURRENT_POINTER, END_OF_FILE] 
    ;INPUT: NUM_BYTES(_1), MOVES THE POINTER NUM1:NUM SPOTS (SIGNED DWORD) WHERE POSITIVE = RIGHT AND NEGATIVE = LEFT 
;INPUT: FILE HANDLE 

    ;OUTPUT: UPDATES THE FILE POINTER 
    ;{ 
     ;START PROC { 
      PUSH BP 
      MOV BP, SP 

      RELATIVE_TO EQU [BP + 10] ;CONSTANT 
      NUM_BYTES_1 EQU [BP + 8] ;HIGH ORDER WORD 
      NUM_BYTES EQU [BP + 6] ;LOW ORDER WORD 
      HANDLE  EQU [BP + 4] ; FILE HANDLE 

      PUSH AX BX CX DX 
     ;} 

     ;CODE { 
      MOV AX, RELATIVE_TO 
      MOV AH, 42h 
      MOV BX, HANDLE 
      MOV CX, NUM_BYTES_1 
      MOV DX, NUM_BYTES 
      INT 21h  
     ;} 

     @@END_PROC: ;{ 
      POP DX CX BX AX 
      POP BP 
      RET 8 
     ;} 
    ;} 
    ENDP FILE_UPDATE_POINTER