2016-04-18 7 views
1

SEGMENTディレクティブを使用して、TASMの下で別々のスタック、データ、およびコードセグメントを作成することに成功しましたが、まだ何か気になります。次のコードをTurbo Assembler 2.0でアセンブルすると、TLINKはサイズが90KBに近いバイナリを生成します。リアルモードでのスタックとデータの割り当てTurbo Assembler 2.0のMZ .exe

.286 

myStack segment para stack 'stack' 
db 0FFFFh dup (?) 
ends myStack 

myData segment para 'data' 
msg db 'Memes!$' 
db 7FFFh dup (?) 
ends myData 

myCode segment para 'code' 
assume cs:myCode 
assume ss:myStack 

start: 
mov ax,myData 
mov ds,ax 

push offset msg 
call write 
add sp,2 

mov ah,4ch 
int 21h 

write: 
push bp 
mov bp,sp 
mov dx,[bp+4] 
mov ah,9h 
int 21h 
pop bp 
ret 

ends myCode 
end start 

今ではMZファイル形式は、それが実際には他に、割り当てられたメモリの最小/最大の段落を経由して、二値画像(に含まれているものを超えてメモリの割り当てが必要であることを指定するには、.exeファイルを有効にする必要がありますように私には思えます私は推測しているコードサイズのエントリに)。

私の質問は、バイナリイメージにプレースホルダの値を直接含めずにメモリを割り当てるための適切なヘッダーを持つ.exeをアセンブラ/リンカをどのようにして同軸にするかです。

答えて

3

しばらくしていますが、コードセグメントを先に配置することで、何をしようとしているのかを達成できると思います。その後、初期化されたすべてのデータをdataセグメントの先頭に配置し、その後にdataセグメント内のすべての初期化されていないデータとそれに続くすべてが初期化されていないスタックセグメントを配置します。すべての初期化されていないデータは強制終了されているため、ファイル内のスペースを割り当てる必要はありません。これは働い

.286 

myCode segment para 'code' 
assume cs:myCode 
assume ss:myStack 

start: 
mov ax,myData 
mov ds,ax 

push offset msg 
call write 
add sp,2 

mov ah,4ch 
int 21h 

write: 
push bp 
mov bp,sp 
mov dx,[bp+4] 
mov ah,9h 
int 21h 
pop bp 
ret 

ends myCode 

myData segment para 'data' 
msg db 'Memes!$'    ; Initialized data first 
db 7FFFh dup (?)    ; Uninitialized data after all initialized data 
ends myData 

myStack segment para stack 'stack' 
          ; Leave blank, this will allow the stack to 
          ; to use the full 64k segment 
ends myStack 

end start 
+0

:それはのように見えた場合

あなたのコードは、おそらくあなたが望む結果を与えるだろう。面白いのは、私は数時間前にそれを試してみました。そして、アセンブラはセグメント名の未知のシンボルについて不平を言っていました!私はそれがあなたのものとまったく同じだと誓っていますが、/ m2のマルチパススイッチを使っても組み立てられません。奇妙な。 – chili

+1

@chiliおそらくあなたは、**前のセグメントではなく、 'end start'セグメントの後に**セグメントを移動しましたか? –

+1

私はあなたが正しいかもしれないと思う; oおかげで男! – chili

関連する問題