added some clarification on cdecl16
This commit is contained in:
104
docs/calling_convention_cdecl16.txt
Normal file
104
docs/calling_convention_cdecl16.txt
Normal file
@@ -0,0 +1,104 @@
|
||||
__cdecl16near Calling Convention
|
||||
Purpose: Used for calling near (within the same segment) functions in 16-bit code.
|
||||
Stack Management: The caller cleans up the stack after the function call.
|
||||
Parameter Passing: Parameters are pushed onto the stack from right to left.
|
||||
Return Address: A near return address (16-bit) is pushed onto the stack.
|
||||
Return Value: The return value is typically placed in the AX register.
|
||||
|
||||
e.g
|
||||
|
||||
; Caller
|
||||
push param2
|
||||
push param1
|
||||
call near_func
|
||||
add sp, 4 ; Clean up the stack (2 parameters * 2 bytes each)
|
||||
|
||||
; Callee (near_func)
|
||||
near_func:
|
||||
push bp
|
||||
mov bp, sp
|
||||
; Function body
|
||||
mov sp, bp
|
||||
pop bp
|
||||
ret
|
||||
|
||||
__cdecl16far Calling Convention
|
||||
Purpose: Used for calling far (across different segments) functions in 16-bit code.
|
||||
Stack Management: The caller cleans up the stack after the function call.
|
||||
Parameter Passing: Parameters are pushed onto the stack from right to left.
|
||||
Return Address: A far return address (32-bit, consisting of a segment and an offset) is pushed onto the stack.
|
||||
Return Value: The return value is typically placed in the AX register.
|
||||
|
||||
e.g
|
||||
|
||||
; Caller
|
||||
push param2
|
||||
push param1
|
||||
call far_func
|
||||
add sp, 4 ; Clean up the stack (2 parameters * 2 bytes each)
|
||||
|
||||
; Callee (far_func)
|
||||
far_func:
|
||||
push bp
|
||||
mov bp, sp
|
||||
; Function body
|
||||
mov sp, bp
|
||||
pop bp
|
||||
retf ; Far return
|
||||
|
||||
Key Differences
|
||||
Return Address: __cdecl16near uses a 16-bit return address, while __cdecl16far uses a 32-bit return address (segment:offset).
|
||||
Function Scope: __cdecl16near is for functions within the same segment, whereas __cdecl16far is for functions that may be in different segments.
|
||||
Return Instruction: __cdecl16near uses ret, while __cdecl16far uses retf (far return).
|
||||
|
||||
|
||||
### REGISTERS ###
|
||||
|
||||
Register Usage in __cdecl16near and __cdecl16far
|
||||
Caller-Saved Registers (Volatile)
|
||||
These registers must be saved by the caller if they wish to preserve their values across function calls:
|
||||
|
||||
AX: Accumulator register, often used for return values.
|
||||
CX: Counter register, commonly used in loops and string operations.
|
||||
DX: Data register, used for I/O operations and arithmetic.
|
||||
SI: Source index for string operations.
|
||||
DI: Destination index for string operations.
|
||||
Callee-Saved Registers (Non-Volatile)
|
||||
These registers must be preserved by the callee. If the callee uses these registers, it must save their original values and restore them before returning:
|
||||
|
||||
BP: Base pointer, used for stack frame management.
|
||||
SP: Stack pointer, although typically managed by the calling convention itself.
|
||||
BX: Base register, often used for addressing.
|
||||
SI: Source index, if not used for string operations.
|
||||
DI: Destination index, if not used for string operations.
|
||||
|
||||
e.g
|
||||
|
||||
; Caller
|
||||
push param2
|
||||
push param1
|
||||
call near_func
|
||||
add sp, 4 ; Clean up the stack (2 parameters * 2 bytes each)
|
||||
|
||||
; Callee (near_func)
|
||||
near_func:
|
||||
push bp
|
||||
mov bp, sp
|
||||
; Save callee-saved registers if used
|
||||
push bx
|
||||
push si
|
||||
push di
|
||||
; Function body
|
||||
; Use AX, CX, DX freely
|
||||
mov ax, [bp+4] ; Access first parameter
|
||||
mov bx, [bp+6] ; Access second parameter
|
||||
;
|
||||
; your other code here
|
||||
;
|
||||
; Restore callee-saved registers
|
||||
pop di
|
||||
pop si
|
||||
pop bx
|
||||
mov sp, bp
|
||||
pop bp
|
||||
ret
|
||||
Reference in New Issue
Block a user