在汇编中写一个 fopen 函数
Write a fopen function in assembly
我正在尝试在 Turbo C++ 3.0 中实现 fopen
,我需要在 asm 内联中编写它。
我写了一个代码,但是(不出意外......)它不起作用(编译失败)。
代码在这里:
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <stdlib.h>
int my_fopen_w(char fname[])
{
int fd;
char status;
status = 'w'; // I need to write to a file and delete previous content
asm{
mov bl, status
xor bh,bh
push bp
mov bp, sp
push bx
push fname
//Same as fopen now fopen(file path= fname, "w" = bx)
call _fopen
add sp,8
// Returned value in AX register
mov fd, ax // That line may be incorrect, my teacher demands an Integer returned value
}
return fd;
}
我收到一个错误:turbo c 无法识别 _fopen
调用。
感谢您的帮助。
海姆
这似乎是 Turbo C 3.0 中的错误。 TCC 3.0 默认将 C 库链接到 CODE 段,因此您可以使用 C 函数的地址加载 AX
(不需要下划线),然后使用 CALL AX
:
#include <stdio.h>
int main ( void )
{
char fname[] = "noname.txt";
char status[] = "wb";
FILE * fd;
asm{
lea ax, status
push ax
lea ax, fname
push ax
lea ax, fopen
call ax
pop cx
pop cx
mov fd, ax
}
return 0;
}
请注意:fopen
需要两个指向两个字符串的指针。这两个指针在编译时都是未知的。所以你必须在 运行 时使用 LEA
来获取它们,除非其他人(操作系统、C 启动代码等)已经为你获取了指针:
#include <stdio.h>
FILE* my_fopen_w(char fname[])
{
FILE * fd;
char status[]="wt";
int my_fd;
asm{
lea ax, status
push ax
mov ax, fname // fname was passed as a pointer ("Call by value")
push ax
lea ax, fopen
call ax
pop cx
pop cx
mov fd, ax
}
return fd;
}
int main(int argc, char *argv[])
{
FILE * fd;
fd = my_fopen_w(argv[1]); // argv[1] is a pointer to a string
fputs("Here I am.", fd);
fclose(fd);
return 0;
}
我正在尝试在 Turbo C++ 3.0 中实现 fopen
,我需要在 asm 内联中编写它。
我写了一个代码,但是(不出意外......)它不起作用(编译失败)。
代码在这里:
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <stdlib.h>
int my_fopen_w(char fname[])
{
int fd;
char status;
status = 'w'; // I need to write to a file and delete previous content
asm{
mov bl, status
xor bh,bh
push bp
mov bp, sp
push bx
push fname
//Same as fopen now fopen(file path= fname, "w" = bx)
call _fopen
add sp,8
// Returned value in AX register
mov fd, ax // That line may be incorrect, my teacher demands an Integer returned value
}
return fd;
}
我收到一个错误:turbo c 无法识别 _fopen
调用。
海姆
这似乎是 Turbo C 3.0 中的错误。 TCC 3.0 默认将 C 库链接到 CODE 段,因此您可以使用 C 函数的地址加载 AX
(不需要下划线),然后使用 CALL AX
:
#include <stdio.h>
int main ( void )
{
char fname[] = "noname.txt";
char status[] = "wb";
FILE * fd;
asm{
lea ax, status
push ax
lea ax, fname
push ax
lea ax, fopen
call ax
pop cx
pop cx
mov fd, ax
}
return 0;
}
请注意:fopen
需要两个指向两个字符串的指针。这两个指针在编译时都是未知的。所以你必须在 运行 时使用 LEA
来获取它们,除非其他人(操作系统、C 启动代码等)已经为你获取了指针:
#include <stdio.h>
FILE* my_fopen_w(char fname[])
{
FILE * fd;
char status[]="wt";
int my_fd;
asm{
lea ax, status
push ax
mov ax, fname // fname was passed as a pointer ("Call by value")
push ax
lea ax, fopen
call ax
pop cx
pop cx
mov fd, ax
}
return fd;
}
int main(int argc, char *argv[])
{
FILE * fd;
fd = my_fopen_w(argv[1]); // argv[1] is a pointer to a string
fputs("Here I am.", fd);
fclose(fd);
return 0;
}