我一直在嘗試將一個示例從 FASM(平面匯編程式)復制到 NASM,但我無法做到,我試圖了解 NASM 處理段(部分)的方式。
ormat mz
entry main:start
stack 100h
segment main
start:
mov ax, text
mov ds, ax
mov dx, hello
call extra:write_text
mov ax, 4c00h
int 21h
segment text
hello db 'Hello world!', 24h
segment extra
write_text:
mov ah, 9
int 21h
retf
FASM 生成一個 MSDOS exe 檔案并在 DEBUG 中加載它我看到以下內容:
0D9D:0000 B89F0D MOV AX,0D9F
0D9D:0003 8ED8 MOV DS,AX
0D9D:0005 BA0000 MOV DX,0000
0D9D:0008 9A0000A00D CALL 0DA0:0000
0D9D:000D B8004C MOV AX,4C00
0D9D:0010 CD21 INT 21
如您所見,FASM 創建了段并將 CALL 設定為遠呼叫。extra 被有效地放置在一個單獨的段中。資料段也位于單獨的段中。
我嘗試在 NASM 中做這個例子:
section code
..start:
mov ax, seg hello
mov ds, ax
mov dx, hello
call extra:write_text
mov ax, 4c00h
int 21h
section data
hello db "Hello World!", 24h
section extra
write_text:
mov ah, 9
int 21h
retf
section stack class=stack
resb 100h
并使用此鏈接檔案與 wlink 鏈接:
system dos
option map
name seg2.exe
file seg2.obj
生成的代碼不同:
0D9D:0000 B89D0D MOV AX,0D9D
0D9D:0003 8ED8 MOV DS,AX
0D9D:0005 BA1200 MOV DX,0012
0D9D:0008 9A1F009D0D CALL 0D9D:001F
0D9D:000D B8004C MOV AX,4C00
0D9D:0010 CD21 INT 21
0D9D:0012 48 DEC AX
0D9D:0013 65 GS: (unused)
0D9D:0014 6C INSB
0D9D:0015 6C INSB
0D9D:0016 6F OUTSW
0D9D:0017 20576F AND [BX 6F],DL
0D9D:001A 726C JB 0088
0D9D:001C 642124 AND FS:[SI],SP
0D9D:001F B409 MOV AH,09
正如您所看到的, write_text 與代碼的其余部分(顯然也是資料段)在同一段中,但它并沒有像我想象的那樣放在一個單獨的段中。
我在這里錯過了什么嗎?有沒有辦法將代碼實際放在單獨的段中?對正在發生的事情或如何實作這一目標的任何幫助、指導或解釋將不勝感激!
是的,我嘗試過 MASM 并且發生了同樣的事情,FASM 是唯一具有這種超能力的人嗎?
謝謝!
uj5u.com熱心網友回復:
您需要的是對記憶體模型的支持,而NASM 缺乏這種支持,它將段間傳輸視為 NEAR 并且程式員負責在必要時對 CALL FAR 指令進行編碼。
不,FASM 不是唯一知道記憶體模型的匯編程式。這是您為€ASM量身定制的程式
| |seg4 PROGRAM Format=MZ,Model=LARGE,Entry=start
|[main] |[main] SEGMENT Purpose=CODE
|0000: |start:
|0000:B8{0000} | mov ax,PARA# [text]
|0003:8ED8 | mov ds, ax
|0005:BA[0000] | mov dx, hello
|0008:9A[0000]{0000} | call write_text
|000D:B8004C | mov ax, 4c00h
|0010:CD21 | int 21h
|0012: |
|[text] |[text] segment Purpose=DATA
|0000:48656C6C6F20776F726C~| hello db 'Hello world!', 24h
|[extra] |[extra] segment Purpose=CODE
|0000: |write_text:
|0000:B409 | mov ah, 9
|0002:CD21 | int 21h
|0004:CB | retf
|[stack] |[stack] SEGMENT Purpose=STACK
|0000:....................~| DW 100h * BYTE
| | ENDPROGRAM
| **** ListMap "seg4.exe",groups=4,segments=4,entry=[main]:00000000h,stack=[stack]:00000100h
| [main],RVA=00000000h,size=00000012h=18,group [main]
| [main],RVA=00000000h,size=00000012h=18,width=16,align=0010h,purpose=CODE
| [text],RVA=00000020h,size=0000000Dh=13,group [text]
| [text],RVA=00000020h,size=0000000Dh=13,width=16,align=0010h,purpose=DATA
| [extra],RVA=00000030h,size=00000005h=5,group [extra]
| [extra],RVA=00000030h,size=00000005h=5,width=16,align=0010h,purpose=CODE
| [stack],RVA=00000040h,size=00000100h=256,group [stack]
| [stack],RVA=00000040h,size=00000100h=256,width=16,align=0010h,purpose=STACK
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/343798.html
