2016-04-28 6 views
2

tasmコンパイラでアセンブリ8086でpusha/popaを使用するにはどうすればよいですか? pushaとpopaは別のタイプのアセンブリ(.286)にあるので、私はそれを使うことはできませんが、コンパイラにそれらのコマンドを含めるように指示する方法があります。TASMで8086にpushaとpopaを使用

今私のコード:

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 

私が取得エラー:

Illegal instruction for currently selected processor(s) 

誰もがそれを行うにはどのように任意のアイデアを持っていますか?

+3

うーん、ちょうど追加し 'あなたのファイルの一番上に.286?実際に 'IDEAL'モードではおそらく' P286'と呼ばれます。 – Jester

+0

私はターボアセンブラーを何年も見たことがありません。 +1(それは?)と素晴らしいアセンブラだったので+1。 'pusha'と' popa'はIIRCのi386命令です。あなたは '8086'のためにそれを使うことはできません。モデルを変更するか、手動でバイトコードを追加します。 – jww

+0

@Jester私はそれが落ちたとは思えません。モデルの後のIDEALの後の '.286'をcodesegとdatasegに入れようとしましたが、ファイルの先頭にはならないと思いました。それはありがとうございました!投稿者 – morha13

答えて

1

ファイルの最初の行で書く0.286:

.286 
IDEAL 
MODEL small 
STACK 100h 
etc. 

編集:私はすでに事のこのタイプを行う手順を書いて、ここで彼らは、次のとおりです。

;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 
関連する問題