> 環境
gccgcc.exe (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0
windows
nasm version 2.15.05 compiled on Aug 28 2020
main.c
#include <stdio.h>
void binary(int*, char*, int*);
void main(void){
int a, b;
binary(&a, "boot.img",&b);
printf("%d %d\n", a,b);
}
void binary(int* file_size, char* file_name, int* bin)
{
asm (
" bin_open: \n"
" mov ah, 0x3d \n"
" mov al, 0x0 \n"
" mov dx, 24[rbp] \n"
" int 0x2 \n"
" jc bin_error \n"
" mov di, ax \n"
" \n"
" bin_read: \n"
" mov ah, 0x3 \n"
" mov bx, di \n"
" mov cx, 0x1 \n"
" mov dx, 32[rbp] \n"
" int 0x21 \n"
" jc bin_error \n"
" add 16[rbp], ax \n"
" mov rax, 32[rbp] \n"
" cmp ax, ax \n"
" jne 0 \n"
" jmp bin_read \n"
" \n"
" bin_close: \n"
" mov ah, 0x3e \n"
" mov bx, di \n"
" int 0x21 \n"
" jc bin_error \n"
" \n"
" \n"
" \n"
" bin_error: \n"
" mov ah, 0x0e \n"
" mov al, 'E' \n"
" int 0x10 \n"
" hlt \n"
" \n"
);
return;
;月夜ちゃんかわええな
; 彼女にしたいw
}
逆アセンブルの結果
.file "EMS_file_open.c"
.intel_syntax noprefix
.text
.def __main; .scl 2; .type 32; .endef
.section .rdata,"dr"
.LC0:
.ascii "boot.img\0"
.LC1:
.ascii "%d %d\12\0"
.text
.globl main
.def main; .scl 2; .type 32; .endef
.seh_proc main
main:
push rbp
.seh_pushreg rbp
mov rbp, rsp
.seh_setframe rbp, 0
sub rsp, 48
.seh_stackalloc 48
.seh_endprologue
call __main
lea rdx, -8[rbp]
lea rax, -4[rbp]
mov r8, rdx
lea rdx, .LC0[rip]
mov rcx, rax
call binary
mov edx, DWORD PTR -8[rbp]
mov eax, DWORD PTR -4[rbp]
mov r8d, edx
mov edx, eax
lea rcx, .LC1[rip]
call printf
nop
add rsp, 48
pop rbp
ret
.seh_endproc
.globl binary
.def binary; .scl 2; .type 32; .endef
.seh_proc binary
binary:
push rbp
.seh_pushreg rbp
mov rbp, rsp
.seh_setframe rbp, 0
.seh_endprologue
mov QWORD PTR 16[rbp], rcx
mov QWORD PTR 24[rbp], rdx
mov QWORD PTR 32[rbp], r8
/APP
# 14 "EMS_file_open.c" 1
bin_open:
mov ah, 0x3d
mov al, 0x0
mov dx, 24[rbp]
int 0x2
jc bin_error
mov di, ax
bin_read:
mov ah, 0x3
mov bx, di
mov cx, 0x1
mov dx, 32[rbp]
int 0x21
jc bin_error
add 16[rbp], ax
mov rax, 32[rbp]
cmp ax, ax
jne 0
jmp bin_read
bin_close:
mov ah, 0x3e
mov bx, di
int 0x21
jc bin_error
bin_error:
mov ah, 0x0e
mov al, 'E'
int 0x10
hlt
# 0 "" 2
/NO_APP
nop
pop rbp
ret
.seh_endproc
.ident "GCC: (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0"
.def printf; .scl 2; .type 32; .endef