【发布时间】:2020-05-16 11:57:19
【问题描述】:
我曾经在 8086 汇编和 Turbo C++ 中编写代码,我决定使用内联汇编进行一些测试,但我遇到了这个问题:
这段代码完美运行:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
FILE *fp;
int regvga=0x13;
int regtxt=0x03;
int vgamem=0xA000;
unsigned char data[64000];
void main (void)
{
fp=fopen("pic1.dat","rb");
fread(data,64000,1,fp);
fclose(fp);
asm{
mov ax,regvga
int 0x10
mov ax,vgamem
mov es,ax
cld
mov cx,32000
lea si,data
mov di,0
rep movsw
}
getch();
asm{
mov ax,regtxt
int 0x10
}
}
但是这段代码根本行不通。
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
FILE *fp;
int regvga=0x13;
int regtxt=0x03;
int vgamem=0xA000;
unsigned char *data;
void main (void)
{
data=(char*)calloc(64000,sizeof(char));
fp=fopen("pic1.dat","rb");
fread(data,64000,1,fp);
fclose(fp);
asm{
mov ax,regvga
int 0x10
mov ax,vgamem
mov es,ax
cld
mov cx,32000
lea si,data
mov di,0
rep movsw
}
getch();
asm{
mov ax,regtxt
int 0x10
}
free(data);
}
它编译没有错误,但图像显示不正确。怎么了?
【问题讨论】:
-
您为哪个模型编译代码?我想问题是您没有使用适当的段选择器加载
ds。我不知道正确的语法是什么,但请尝试将lea si, data替换为lds si, data。 -
使用 Turbo 有什么理由吗?它在很久以前就停产了。
-
只是为了排除它。如果将
unsigned char data[64000];替换为unsigned char d[64000]; unsigned char *data = d;会发生什么? -
你验证
calloc真的成功了吗?它可能会返回NULL,以防堆不够大,无法分配一大块 64,000 字节。 -
@klutt 这是某些国家的课程。这不能怪学生。