インラインアセンブラ - 引数合っているはず

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ぷぷぷジューシー
記事: 28
登録日時: 3年前
住所: アンドロメダ銀河系のどこかに住んでいる

インラインアセンブラ - 引数合っているはず

#1

投稿記事 by ぷぷぷジューシー » 2年前

インラインアセンブラでバイナリファイルを開こうとしたが、引数が合わないのか落ちます


> 環境
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

面倒なことはCGo使おう!

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: インラインアセンブラ - 引数合っているはず

#2

投稿記事 by みけCAT » 2年前

文字列やローカル変数のアドレス(64ビット)の下位16ビットだけをdxレジスタに入れて何をしたいのかよくわかりませんが、
とりあえず int 0x2 というのは不自然に思えます。
0から作るOS開発 割り込みその1 割り込みとIDTとGDT
によると、x86の割り込みベクタの2番はNMIとなっています。
NMIは致命的なハードウェアエラーを表すのに使われるため、「落ちた」と判定されるかもしれません。
他の場所と同様に int 0x21 としたかったのではないでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ぷぷぷジューシー
記事: 28
登録日時: 3年前
住所: アンドロメダ銀河系のどこかに住んでいる

Re: インラインアセンブラ - 引数合っているはず

#3

投稿記事 by ぷぷぷジューシー » 2年前

コード:

dx にfile_name突っ込みたい

Nびttレジスタ違う同士で変換しtらり戻したりしたい

上記のコードをint 21h tって書かれるでー

file radに回してfile_sizeでバイト数記憶されているなんかあったら出るようにしているはず
面倒なことはCGo使おう!

ぷぷぷジューシー
記事: 28
登録日時: 3年前
住所: アンドロメダ銀河系のどこかに住んでいる

Re: インラインアセンブラ - 引数合っているはず

#4

投稿記事 by ぷぷぷジューシー » 2年前

movじゃ仕様書見たけど無理だねhttps://www.intel.co.jp/content/dam/www/public/ ... 3502_i.pdf
面倒なことはCGo使おう!

ぷぷぷジューシー
記事: 28
登録日時: 3年前
住所: アンドロメダ銀河系のどこかに住んでいる

Re: インラインアセンブラ - 引数合っているはず

#5

投稿記事 by ぷぷぷジューシー » 2年前

面倒なことはCGo使おう!

Bull
記事: 149
登録日時: 9年前

Re: インラインアセンブラ - 引数合っているはず

#6

投稿記事 by Bull » 2年前

int 21h は MS-DOS のシステムコールなので、昨今の 64bit Windows では動かないですね。
たとえ 32bit Windows でも、gcc のインラインアセンブラで動かすのは無理があります。

64bit Windows で MS-DOS のプログラムを動かすのであれば、仮想環境を用意するのがいいのではないかと思います。MS-DOS そのものを入手するのは容易ではないですが、MS-DOS の互換のものがあるようです。
それで、MS-DOS 用のコンパイラなり、アセンブラを用意して、プログラミングする必要があります。

ぷぷぷジューシー
記事: 28
登録日時: 3年前
住所: アンドロメダ銀河系のどこかに住んでいる

Re: インラインアセンブラ - 引数合っているはず

#7

投稿記事 by ぷぷぷジューシー » 2年前

>> Bull
んーなるほど、、、
64bit_windowsではint 21hは直接だと動ない。
んじゃ64bit_windowsの命令探してくる
面倒なことはCGo使おう!

ぷぷぷジューシー
記事: 28
登録日時: 3年前
住所: アンドロメダ銀河系のどこかに住んでいる

Re: インラインアセンブラ - 引数合っているはず

#8

投稿記事 by ぷぷぷジューシー » 2年前

ないっぽいので素直に標準ライブラリ使用します
面倒なことはCGo使おう!

返信

“C言語何でも質問掲示板” へ戻る