文档库 最新最全的文档下载
当前位置:文档库 › 8086汇编和c语言混合实现操作系统

8086汇编和c语言混合实现操作系统

8086汇编和c语言混合实现操作系统
8086汇编和c语言混合实现操作系统

实验三

一、实验目的

1. 掌握TASM汇编语言与TURBO C语言汇合编程的方法。

2. 实现内核与引导程序分离,掌握软盘上引导操作系统方法。

3. 设计并实现一种简单的作业控制语言,建立具有较友好的控制命令的批处理原型操作系统,掌握操作系统提供用户界面和内部功能的实现方法。

二、实验内容

在实验二的基础上,进化你的原型操作系统,增加下列操作系统功能:

(1)将原型操作系统分离为引导程序和MYOS内核,由引导程序加载内核;

(2)内核由汇编语言kernal.asm和c语言kernal.c二个模块生成;

(3)利用C语言实现作业控制语言mJCB,原型操作系统在当前行显示一个指示符(可以是简单的一个字符或你的学号之类),允许用户输入一行命令(回车结束,语法由你设计),操作系统解释命令并完成相应的功能(3个以上的内置功能,如time、date、asc等,而且能执行软盘上的某个用户程序),并在你的实验报告中详细介绍你的mJCB语言的语法格式和功能。

三、实验报告

1、涉及的基础知识和实验环境工具综述、你的解决方案包括程序算法原理或流程图、程序模块说明、变量定义与作用说明、数据结构组织等

A.实验环境工具综述:

本次试验环境为VMware9平台上搭建的8086虚拟机,编译器为tasm,tcc,链接器为tlink,通过Winhex剪辑2进制文件,并用DiskWriter工具将

主程序写入虚拟软盘,通过虚拟机加载软盘实现裸机运行。

B.算法原理:

a)计算机启动后,通过引导扇区加载软盘上余下的有效扇区。

b)引导扇区安装必要的中断,如8号中断用以动态显示时间,21号中

断用以用户程序的返回,设置栈指针,数据段指针,建立c语言运

行环境,设置计数器,用以动态显示时间。配置完成后,转入基于c

语言的控制程序的运行。

c)基于c语言的控制程序无限重复向输入端请求命令,解析命令,跳

转调用对应程序,但接收到重启命令时重启,接到关机命令时进行

关机。

d)系统总的实现为引导程序(osa.asm),汇编实现的c语言函数库

(clib.asm),汇编实现的中断程序库(oslib.asm),c语言实现的控制台

程序(osc.c)。

e)由于系统已搭建c语言运行环境,并提供了相应的库,再提供一个

供用户用于链接c语言程序的启动程序,用户程序即可完全由c语

言实现。启动程序指定用户程序的偏移(如c9000.asm指定了用户的

c程序偏移为9000h,可更改启动程序中的org来更改目标程序的偏

移),并能够返回控制台(通过调用自己安装的int 21H返回)。C.程序模块说明:

a)clib.asm中汇编实现的c函数库

extern char cls();

功能:清屏,清空第0页的显存

输入:无

返回:无

extern int puts(const char * str);

功能:向当前光标位置输出字符串

输入:字符串首地址

返回:输出字符个数

extern char* gets(char* str);

功能:读取字符串

输入:字符串首地址

返回:字符串首地址

extern int strlen(const char *str);

功能:求以0结束的字符串的长度

输入:字符串首地址

返回:字符从长度

extern int getchar(void);

功能:读取字符

输入:无

返回:字符的ascii码

extern int putchar(int c);

功能:输出字符

输入:字符c

返回:字符c

extern unsigned int port_in8(unsigned int port);

功能:从port端口读入8位数据

输入:端口号

返回:读取的数据

extern unsigned int port_in16(unsigned int port);

功能:从port端口读入16位数据

输入:端口号

返回:读取的数据

extern void port_out8(unsigned int port, unsigned int value);

功能:向port端口输出8位数据value

输入:端口号和数据

返回:无

extern void port_out16(unsigned int port, unsigned int value);

功能:从port端口输出16位数据value

输入:端口号和数据

返回:无

extern void setp_cursor(unsigned int bh, unsigned int dh, unsigned int dl);

功能:将第bh页的指针置于dh行dl列

输入:页号bh,行号dh,列号dl

返回:无

extern void run_pro(int ord);

功能:运行程序地址表中第ord号程序

输入:程序序号

返回:无

b)主控制程序:osc.c

extern char cls(); extern int puts(const char * str);

extern char* gets(char* str);

extern int strlen(const char *str);

extern int getchar(void);

extern int putchar(int c);

extern unsigned int port_in8(unsigned int port);

extern unsigned int port_in16(unsigned int port);

extern void port_out8(unsigned int port, unsigned int value);

extern void port_out16(unsigned int port, unsigned int value);

extern void setp_cursor(unsigned int bh, unsigned int dh, unsigned int dl);

extern void run_pro(int ord);

void inttostr(int x, char *str);

int strtoint(char *str);

unsigned int bcdtodex(unsigned int x);

void get_date(char* buf);/*yy-mm-dd*/

void set_date(char *buf);

void get_time(char* buf);/*hh:mm:ss*/

void set_time(char *buf);

void pre_time();

void interface();

int strcmp(char str1[], char str2[]);

void atoA(char *buf);

int deal(char *buf);

int inside(int min, int max, int x);

int change_time(int paras);

int islegal(int y, int m, int d);

int change_date(int paras);

int shutdown(int paras);

int reboot(int paras);

int jc(int paras, char *buf);

char buffer[80];

int control = 1;

char Exit_Message[30] = "\nPress any key to exit...";

unsigned int add_Table[30] = {0x9000, 0, 0xa000, 0, 0xb000, 0};

cmain(){

int paras;

control = 0;

while (1)

{

cls();

interface();

gets(buffer);

setp_cursor(0, 6, 0);

paras = deal(buffer);

if (paras != 0)

{

jc(paras, buffer);

puts(Exit_Message);

getchar();

}

}

}

c)用户程序:cx0.c cx1.c

2、实验步骤、操作的主要过程、运行结果、屏幕画面截图等

A.实验步骤

a)编写代码

b)在dosbox上执行批处理文件0.bat,得到https://www.wendangku.net/doc/cf5992423.html,,执行9000.bat得到

用户程序1,执行a000.bat得到用户程序2

c)使用WinHex将https://www.wendangku.net/doc/cf5992423.html,中7e00h到结束的所有数据写到虚拟软盘文

件Tinix.img偏移为0的位置处,将用户程序1和用户程序2对应的

代码写到1400h和2400h处。

d)从软盘启动虚拟机

B.屏幕截图

a)开机界面

b)时间设置

c)日期设置

d)运行程序地址表中的用户程序

e)指令参数错误检查

f)执行重启命令,由于重启时无法截图,只提供命令输入界面

g)关机指令

C.指令总结

a)Time 修改cmos时间,不需要参数

b)Date 修改cmos日期,不需要参数

c)Run x执行第x号用户程序,1<=x<=2,安装新程序x需扩展。

d)Reboot 重启,不需要参数

e)Shutdown 关机,不需要参数

四、实验心得体会

A.程序c语言环境的配置和实现,应基于编译器tcc默认的调用规范cdecl。

a)cdecl在8086上对c语言参数的入栈顺序为从右向左入栈,对栈的恢

复由程序调用者caller实现,汇编实现c语言函数库时,不需要在

函数中对栈进行恢复。在汇编程序中调用c实现的函数,对参数压

栈和对函数返回后要注意恢复。

b)cdecl对函数的返回值,8位,16位和32位分别存放于al、ax、dx

和ax中,汇编中调用c实现的函数时返回值的获取为以上寄存器。

c)cdecl只对ds,ss,bp,si,di等寄存器进行保护。当在汇编中调用c

实现的函数时,若通用寄存器ax,bx,cx,dx中存在有意义的值,

要自行进行压栈保护。

B.实现tcc的过程中,发现tcc在栈的处理上存在bug。tcc编译tcc_bug文

件得到的二进制文件,通过debug反汇编解析,发现,tcc对函数中的临时字符串buf的取值从[bx + offset]中取(产生错误的位置在tcc_bug.c 文件中有标注),而bx默认的段地址为ds而不是ss。当ds不等于ss时,会取出错误的值,产生乱码。解决方法:通过在引导程序中配置c语言环境时ds和ss设置相同的值,成功解决产生乱码的问题。

C.由于8086程序在dos上运行是使用int 21h的4ch号功能返回控制台,

本次实验对安装了仅有单个iret指令的21h中断,来实现初步对dos程序的小的兼容,用于与用户的c语言链接的启动程序使用int 21h调用安装的iret进行返回控制台。

Osc.c

extern char cls(); extern int puts(const char * str);

extern char* gets(char* str);

extern int strlen(const char *str);

extern int getchar(void);

extern int putchar(int c);

extern unsigned int port_in8(unsigned int port);

extern unsigned int port_in16(unsigned int port);

extern void port_out8(unsigned int port, unsigned int value);

extern void port_out16(unsigned int port, unsigned int value);

extern void setp_cursor(unsigned int bh, unsigned int dh, unsigned int dl); extern void run_pro(int ord);

void inttostr(int x, char *str);

int strtoint(char *str);

unsigned int bcdtodex(unsigned int x);

void get_date(char* buf);/*yy-mm-dd*/

void set_date(char *buf);

void get_time(char* buf);/*hh:mm:ss*/

void set_time(char *buf);

void pre_time();

void interface();

int strcmp(char str1[], char str2[]);

void atoA(char *buf);

int deal(char *buf);

int inside(int min, int max, int x);

int change_time(int paras);

int islegal(int y, int m, int d);

int change_date(int paras);

int shutdown(int paras);

int reboot(int paras);

int jc(int paras, char *buf);

char buffer[80];

int control = 1;

char Exit_Message[30] = "\nPress any key to exit...";

unsigned int add_Table[30] = {0x9000, 0, 0xa000, 0, 0xb000, 0};

cmain(){

int paras;

control = 0;

while (1)

{

cls();

interface();

gets(buffer);

setp_cursor(0, 6, 0);

paras = deal(buffer);

if (paras != 0)

{

jc(paras, buffer);

puts(Exit_Message);

getchar();

}

}

/*control = 1;*/

}

void inttostr(int x, char *str)

{

int l = 0;

int i, offset;

char buf[10];

if (x == 0)

{

str[0] = '0';

str[1] = 0;

return;

}

if (x < 0)

{

x = -x;

offset = 1;

str[0] = '-';

}

else

offset = 0;

while (x > 0)

{

buf[l] = x % 10 + '0';

x = x / 10;

l++;

}

for (i = 0; i < l; ++i)

str[l - i - 1 + offset] = buf[i];

str[l + offset] = 0;

}

int strtoint(char *str)

{

int len = strlen(str);

int i;

int sou;

int p;

int ans;

if (str[0] == '-')

{

sou = 1;

p = -1;

}

else

{

sou = 0;

p = 1;

}

ans = 0;

for (i = sou; i < len; ++i)

ans = ans * 10 + (str[i] - '0');

return ans * p;

}

unsigned int bcdtodex(unsigned int x) {

return (x >> 4) * 10 + (x & 0xf); }

void get_date(char* buf)/*yy-mm-dd*/ {

unsigned int y, m, d;

port_out8(0x70, 9); /*获取年*/

y = port_in8(0x71) & 0xff;

buf[0] = (y >> 4) + '0';

buf[1] = (y & 0xf) + '0';

buf[2] = '-';

port_out8(0x70, 8);/*获取月*/

m = port_in8(0x71) & 0xff;

buf[3] = (m >> 4) + '0';

buf[4] = (m & 0xf) + '0';

buf[5] = '-';

port_out8(0x70, 7);/*获取日*/

d = port_in8(0x71) & 0xff;

buf[6] = (d >> 4) + '0';

buf[7] = (d & 0xf) + '0';

buf[8] = 0;

}

void set_date(char *buf)

{

unsigned int y, m, d;

y = ((buf[0] - '0') << 4) + buf[1] - '0';

port_out8(0x70, 9);

port_out8(0x71, y);

m = ((buf[3] - '0') << 4) + buf[4] - '0';

port_out8(0x70, 8);

port_out8(0x71, m);

d = ((buf[6] - '0') << 4) + buf[7] - '0';

port_out8(0x70, 7);

port_out8(0x71, d);

}

void get_time(char* buf)/*hh:mm:ss*/ {

unsigned int h, m, s;

port_out8(0x70, 4); /*获取时*/

h = port_in8(0x71) & 0xff;

buf[0] = (h >> 4) + '0';

buf[1] = (h & 0xf) + '0';

buf[2] = ':';

port_out8(0x70, 2);/*获取分*/

m = port_in8(0x71) & 0xff;

buf[3] = (m >> 4) + '0';

buf[4] = (m & 0xf) + '0';

buf[5] = ':';

port_out8(0x70, 0);/*获取秒*/

s = port_in8(0x71) & 0xff;

buf[6] = (s >> 4) + '0';

buf[7] = (s & 0xf) + '0';

buf[8] = 0;

}

void set_time(char *buf)

{

unsigned int h, m, s;

h = ((buf[0] - '0') << 4) + buf[1] - '0';

port_out8(0x70, 4);

port_out8(0x71, h);

m = ((buf[3] - '0') << 4) + buf[4] - '0';

port_out8(0x70, 2);

port_out8(0x71, m);

s = ((buf[6] - '0') << 4) + buf[7] - '0';

port_out8(0x70, 0);

port_out8(0x71, s);

}

void pre_time()

{

char buf[20];

{

/*setp_cursor(0, 1, 62);*/

/*puts("Time:");*/

setp_cursor(0, 1, 70);

get_time(buf);

puts(buf);

/*setp_cursor(0, 2, 62);*/

/*puts("Date:");*/

setp_cursor(0, 2, 70);

get_date(buf);

puts(buf);

}

}

void interface()

{

int i;

int pos[4];

pos[0] = 0;

pos[1] = 8;

pos[2] = 60;

pos[3] = 79;

cls();

setp_cursor(0, 0, 0);

for (i = 0; i < 80; ++i)

putchar('=');

for (i = 0; i < 4; ++i)

{

setp_cursor(0, 1, pos[i]);

putchar('|');

}

for (i = 0; i < 4; ++i)

{

setp_cursor(0, 2, pos[i]);

putchar('|');

}

setp_cursor(0, 3, 0);

for (i = 0; i < 80; ++i)

putchar('=');

setp_cursor(0, 1, 2);

puts("Lab03");

setp_cursor(0, 1, 62);

/*把以下部分放到pre_time,乱码,寻址问题?*/ puts("Time:");

setp_cursor(0, 2, 62);

puts("Date:");

pre_time();

setp_cursor(0, 2, 30);

puts("MYOS 3.0");

setp_cursor(0, 4, 0);

puts("Input command:");

setp_cursor(0, 5, 0);

for (i = 0; i < 80; ++i)

putchar('-');

setp_cursor(0, 4, 14);

}

int strcmp(char str1[], char str2[])

{

int len1 = strlen(str1);

int len2 = strlen(str2);

int i = 0, j = 0;

while (i < len1 && j < len2 && str1[i] == str2[j])

{

i++;

j++;

}

return (str2[j] - str1[i]);

}

void atoA(char *buf)

{

int len = strlen(buf);

int i;

for (i = 0; i < len; ++i)

if ('a' <= buf[i] && buf[i] <= 'z') buf[i] -= 'a' - 'A'; }

int deal(char *buf)

{

int len = strlen(buf);

int pos = 0;

int pos0 = 0;

int paras;

paras = 0;

atoA(buf);

while (pos < len)

{

while (buf[pos] == ' ') pos++;

if (pos < len)

{

paras++;

while (pos < len && buf[pos] != ' ')

{

buf[pos0] = buf[pos];

pos0++;

pos++;

}

buf[pos0] = 0;

pos0++;

pos++;

}

}

return paras;

}

int inside(int min, int max, int x)

{

return (min <= x && x <= max);

}

int change_time(int paras)

{

char t[10];

int h, m, s;

int tx[6];

int x, i;

tx[0] = 0; tx[1] = 1; tx[2] = 3; tx[3] = 4; tx[4] = 6; tx[5] = 7;

if (paras != 1)

{

puts("-2: Parameter is wrong!");

return -2;

}

puts("Input time \"hh:mm:ss\": ");

gets(t);

x = 0;

for (i = 0; i < 6; ++i)

if (!inside('0', '9', t[tx[i]])) x = 1;

if (x == 0 && strlen(t) == 8 && t[2] == ':' && t[5] == ':')

{

t[2] = 0; t[5] = 0;

h = strtoint(t + 0);

m = strtoint(t + 3);

s = strtoint(t + 6);

if (inside(0, 23, h) && inside(0, 59, m) && inside(0, 59, s)) set_time(t);

else

x = 1;

}

if (x == 1)

{

puts("-3: The time you inputed is wrong!");

return -3;

}

puts("0: Success!");

return 0;

}

int islegal(int y, int m, int d)

{

if ((m == 1 || m == 3 || m == 5 || m == 7 ||

m == 8 || m == 10 || m == 12) &&

(1 <= d && d <= 31))

return 1;

if ((m == 4 || m == 6 || m == 9 || m == 11) &&

(1 <= d && d <= 30))

return 1;

if (m == 2 &&

(( (y % 4 == 0) &&

((y % 100 != 0) || (y % 400 == 0)) &&

(1 <= d && d <= 29) ) ||

(1 <= d && d <= 28))) return 1;

return 0;

}

int change_date(int paras)

{

char t[10];

int y, m, d;

int tx[6];

int x, i;

tx[0] = 0; tx[1] = 1; tx[2] = 3; tx[3] = 4; tx[4] = 6; tx[5] = 7;

if (paras != 1)

{

puts("-2: Parameter is wrong!");

return -2;

}

puts("Input date \"YY-MM-DD\": ");

gets(t);

x = 0;

for (i = 0; i < 6; ++i)

if (!inside('0', '9', t[tx[i]])) x = 1;

if (x == 0 && strlen(t) == 8 && t[2] == '-' && t[5] == '-') {

t[2] = 0; t[5] = 0;

y = strtoint(t + 0);

m = strtoint(t + 3);

d = strtoint(t + 6);

if (islegal(y, m, d))

set_date(t);

else

x = 1;

}

if (x == 1)

{

puts("-3: The date you inputed is wrong!");

return -3;

}

puts("0: Success!");

return 0;

}

int run(int paras, char buf[])

{

int ord;

/*buf整理后前3个字符为run,第4个为0,第五个开始为序号*/ if (paras != 2 || !inside('1', '2', buf[4]))

{

puts("-2: Parameter is wrong!");

return -2;

}

ord = strtoint(buf + 4);

run_pro(ord - 1);

return 0;

}

int shutdown(int paras)

{

if (paras != 1)

{

puts("-2: Parameter is wrong!");

return -2;

}

puts("Shutting down...");

port_out16(0x1004, 0x2001);

}

int reboot(int paras)

{

if (paras != 1)

{

puts("-2: Parameter is wrong!");

return -2;

}

port_out8(0x64, 0xfe);

}

int jc(int paras, char *buf)

{

int i;

if (strcmp(buf, "TIME") == 0) return change_time(paras);

if (strcmp(buf, "DATE") == 0) return change_date(paras);

if (strcmp(buf, "SHUTDOWN") == 0) return shutdown(paras);

if (strcmp(buf, "REBOOT") == 0) return reboot(paras);

if (strcmp(buf, "RUN") == 0) return run(paras, buf);

puts("Command is wrong!");

return -1;

}

x86汇编指令集

x86汇编指令集 数据传输指令它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. MOVSX reg16,r/m8 ; o16 0F BE /r [386] MOVSX reg32,r/m8 ; o32 0F BE /r [386] MOVSX reg32,r/m16 ; o32 0F BF /r [386] MOVZX reg16,r/m8 ; o16 0F B6 /r [386] MOVZX reg32,r/m8 ; o32 0F B6 /r [386] MOVZX reg32,r/m16 ; o32 0F B7 /r [386] PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.

PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. BSWAP 交换32位寄存器里字节的顺序 XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX ) XADD 先交换再累加.( 结果在第一个操作数里) XLAT 字节查表转换. ── BX 指向一张256 字节的表的起点, AL 为表的索引值(0-255,即 0-FFH); 返回AL 为查表结果. ( [BX+AL]->AL ) 2. 输入输出端口传送指令. IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} ) OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器) 输入输出端口由立即方式指定时, 其范围是0-255; 由寄存器DX 指定时, 其范围是0-65535. 3. 目的地址传送指令. LEA 装入有效地址. 例: LEA DX,string ;把偏移地址存到DX. LDS 传送目标指针,把指针内容装入DS. 例: LDS SI,string ;把段地址:偏移地址存到DS:SI. LES 传送目标指针,把指针内容装入ES. 例: LES DI,string ;把段地址:偏移地址存到ES:DI. LFS 传送目标指针,把指针内容装入FS.

8086汇编语言程序设计

实验1 简单汇编语言程序设计 一、实验目的与要求 1.熟悉汇编语言运行、调试环境及方法。 2.掌握简单汇编语言程序的设计方法。 3.熟悉调试工具DEBUG,并运用DEBUG 工具调试程序。 二、实验内容 根据下列要求,编写汇编源程序,汇编连接汇编源程序,并利用DEBUG 工具调试程序,验证程序的正确性。 1. 若X、Y、R、W 是存放8 位带符号数字节单元的地址,Z 是16 位字单元的 地址。试编写汇编程序,完成Z←((W-X) ÷5-Y)?(R+ 2) 。 2.试编写一个程序,测试某数是否是奇数。如该数是奇数,则把DL 的第0 位置1,否则将该位置0。 三、实验报告要求 1.程序算法流程图。 2.源程序清单。 3.程序运行结果。 4.调试过程中遇到的问题和解决的方法。

实验2 分支及循环程序设计 一、实验目的与要求 1.熟悉汇编语言运行、调试环境及方法。 2.掌握分支程序和循环程序的设计方法。 3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。 二、实验内容 根据下列要求,编写汇编源程序,汇编连接汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。 1.编写汇编程序,统计某存储区若干个数据中英文字母的个数,并将结果在屏幕上显示。 2.从键盘任意输入一组字符数据,请编写汇编程序将该组数据加密后在屏幕上显示。参考加密方法是:每个数乘以2。(说明:本题的加密方法,同学们可以自己拟定) 三、实验报告要求 1.程序算法流程图。 2.源程序清单。 3.程序运行结果。 4.调试过程中遇到的问题和解决的方法。

实验3 子程序程序设计 一、实验目的与要求 1.熟悉汇编语言运行、调试环境及方法。 2.掌握子程序的设计方法。 3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。 二、实验内容 根据下列要求,编写汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。 1.编程以十进制形式和十六进制形式显示AX的内容,并把两个显示功能分别封装成子程序dispDEC和dispHEX。 2.设在以EXAMSCORE为首地址的数据缓冲区依次存放某班10名同学5门功课的成绩,现要统计各位同学的总分,并将总分放在该学生单科成绩后的单元,并调用第1个程序封装好的子程序,以十进制方式显示统计情况,显示格式自行设计。请编程完成此功能。数据缓冲区参考数据定义如下: EXAMSCORE DB 01 ;学号 DB 89,76,54,77,99 ;单科成绩 DW ? ;该学生的总分 DB 02 ;学号 DB 79,88,64,97,92 ;单科成绩 DW ? ;该学生的总分 三、实验报告要求 1.程序算法流程图。 2.源程序清单。 3.程序运行结果。 4.调试过程中遇到的问题和解决的方法。

汇编语言四则运算

《微机原理与接口技术》 课程设计 电气与自动化工程系 通信工程 2010-12-28 院 系:专 业: 年级班级: 学 号: 姓 名: 指导教师:设计日期:

一、课程设计目的 每个同学在1-2周时间内,用汇编语言独立完成一个程序题,以达到熟练运用汇编语言编程实现有比较完整功能的程序的目的。 二、课程设计要求 从键盘上输入数字参与运算,并在屏幕上显示结果,至少实现加法减法运算。 三、课题分析 该程序设计的关键是要根据四则运算中()、*、/、+、-、= 的优先级设置符号的权值,其中(、*、/、+、-、)、= 的权值分别设置为5、4、4、3、3、1、0 ,然后根据权值的大小进行运算。程序使用数字标志SIGN1、括号标志SIGN2分别来判断数字是否输入完毕和括号是否配对,另外程序定义两个数据存储区域NUMB和MARK,其中NUMB用来保存输入的或运算的数值,MARK用来保存输入的符号及其对应的权值。程序不断判断输入的符号是否是左括号‘(’,当遇到左括号是在存储区MARK保存其符号,紧跟着将‘(’的权值改为2并保存之,这是为了使程序运算括号内的表达式,当遇到右括号‘)’时括号内运算将结束。需要注意的是程序执行完括号内表达式的运算及乘除运算后将在存储区MARK中覆盖符号(、)、*、/ 及紧跟着的权值,使得程序在运算整个四则运算表达式时当括号内表达式的运算及乘除运算结束后存储区MARK中只有‘ +、-’运算符及紧跟着的权值,然后按照+、- 运算符的左右顺序从左到右进行‘ +、- ’运算,当最后遇到等号‘ = ’时输出表达式的数值,然后再根据提示判断是否继续执行下一个四则运算表达式。

汇编语言知识大全

第一章基础知识: 一.机器码:1.计算机只认识0,1两种状态。而机器码只能由0,1组成。故机器码相当难认,故产生了汇编语言。 2.其中汇编由三类指令形成:汇编指令(有机器码对应),伪指令,其他符号(编译的时候有用)。 每一总CPU都有自己的指令集;注意学习的侧重点。 二.存储器:1.存储单元中数据和指令没任何差别。 2.存储单元:Eg:128个储存单元(0~127)128byte。 线: 1.地址总线:寻址用,参数(宽度)为N根,则可以寻到2^N个内存单元。 据总线:传送数据用,参数为N根,一次可以传送N/8个存储单元。 3.控制总线:cpu对元器件的控制能力。越多控制力越强。 四.内存地址空间:1.由地址总线决定大小。 2.主板:cpu和核心器件(或接口卡)用地址总线,数据总线,控制总 线连接起来。 3.接口卡:由于cpu不能直接控制外设,需通过接口卡间接控制。

4.各类存储器芯片:RAM,BIOS(主板,各芯片)的ROM,接卡槽的 RAM CPU在操控他们的时候,把他们都当作内存来对待,把他们总的看作一个由 若干个存储单元组成的逻辑存储器,即我们所说的内存地址空间。 自己的一点理解:CPU对内存的操作是一样的,但是在cpu,内存,芯片之间的硬件本身所牵扯的线是不同的。所以一些地址的功能是对应一些芯片的。 第二章寄存器 引入:CPU中含有运算器,寄存器,控制器(由内部总线连接)。而寄存器是可以用来指令读写的部件。8086有14个寄存器(都是16位,2个存储空间)。 一.通用寄存器(ax,bx,cx,dx),16位,可以分为高低位 注意1.范围:16位的2^16-1,8位的2^8-1 2.进行数据传送或运算时要注意位数对应,否则会报错 二.字:1. 1个字==2个字节。 2. 在寄存器中的存储:0x高位字节低位字节;单元认定的是低单元 数制,16进制h,2进制b

80x86汇编语言程序设计教程》(清华大学出版社,黑色封面,杨季文著)

80x86汇编语言程序设计教程》(清华大学出版社,黑色封面,杨季文著) 《计算机操作系统原理》 《Inside Windows 2000》(微软出版社,我看的是E文版的,中文的书名想必是Windows 2000 技术内幕之类吧)。 《数据结构和算法》——这门课程能够决定一个人程序设计水平的高低,是一门核心课程。我首选的是清华版的(朱战立,刘天时) 《软件工程》——这门课程是越到后来就越发现它的重要,虽然刚开始看时就象看马哲一样不知所云。我的建议是看《实用软件工程》(黄色,清华) 《Windows 程序设计》——《北京大学出版社,Petzold著》我建议任何企图设计Windows 程序的人在学习VC以前仔细的学完它。而且前面的那本 建议:你还可以在CSDN上阅读到许多书评。这些书评能够帮助你决定读什么样的书 关于编程的网站 计算机编程 郭新明-FTP服务器体验式学习课程(张孝祥监制) https://www.wendangku.net/doc/cf5992423.html,/so/so138.aspx?id=3997 https://www.wendangku.net/doc/cf5992423.html,快速开发新闻系统在线播放 https://www.wendangku.net/doc/cf5992423.html,/so/so138.aspx?id=4708 数字电路基础[宁波电大] https://www.wendangku.net/doc/cf5992423.html,/so/so138.aspx?id=774 计算机组成与汇编语言程序设计(赵丽梅)宁波电大 https://www.wendangku.net/doc/cf5992423.html,/so/so138.aspx?id=1242 操作系统(陈访荣)宁波电大(在线播放) https://www.wendangku.net/doc/cf5992423.html,/so/so138.aspx?id=4708 计算机网络(马敏飞)宁波电大 https://www.wendangku.net/doc/cf5992423.html,/so/so138.aspx?id=1243 https://www.wendangku.net/doc/cf5992423.html, 2.0快速入门(12)-https://www.wendangku.net/doc/cf5992423.html, 2.0网站快速导航 https://www.wendangku.net/doc/cf5992423.html,/so/so138.aspx?id=2501 Internet和Intranet应用(薛昭旺)宁波电大 https://www.wendangku.net/doc/cf5992423.html,/so/so138.aspx?id=1245 2004年电脑硬件安装调试维修视频教学讲授 https://www.wendangku.net/doc/cf5992423.html,/so/so138.aspx?id=4825 https://www.wendangku.net/doc/cf5992423.html, 高级排错技巧 https://www.wendangku.net/doc/cf5992423.html,/so/so138.aspx?id=768 SQL Server 2000管理专家系列课程 https://www.wendangku.net/doc/cf5992423.html,/so/so138.aspx?id=4832 开心三人行系列(2):使用Atlas 构建AJAX应用 https://www.wendangku.net/doc/cf5992423.html,/so/so138.aspx?id=2564 Visual Basic 2005开发技巧系列课程(4): 在Visual Basic 2005中使用.NET Framework 2.0新增功能 https://www.wendangku.net/doc/cf5992423.html,/so/so138.aspx?id=2526 SQL Server 2005 系列课程-使用ADO https://www.wendangku.net/doc/cf5992423.html,开发SQL Server 2005 OLAP应用 https://www.wendangku.net/doc/cf5992423.html,/so/so138.aspx?id=2535

汇编语言课程设计报告——实现加减乘除四则运算的计算器

汇编语言课程设计报告 ( 2011 -- 2012 年度第 2 学期) 实现加减乘除四则运算的计算器 专业 计算机科学与技术 学生姓名 班级 学号 指导教师 完成日期

目录 目录错误!未定义书签。 1 概述错误!未定义书签。 设计目的错误!未定义书签。 设计内容错误!未定义书签。 2 系统需求分析错误!未定义书签。 系统目标错误!未定义书签。 主体功能错误!未定义书签。 开发环境错误!未定义书签。 3 系统概要设计错误!未定义书签。 系统的功能模块划分错误!未定义书签。系统流程图错误!未定义书签。 4系统详细设计错误!未定义书签。 5 测试错误!未定义书签。 测试方案错误!未定义书签。 测试结果错误!未定义书签。 6 小结错误!未定义书签。 参考文献错误!未定义书签。 附录错误!未定义书签。 附录源程序清单错误!未定义书签。

实现加减乘除四则运算的计算器 1 概述 设计目的 本课程设计是在学完教学大纲规定的全部内容、完成所有实践环节的基础上,旨在深化学生学习的汇编语言课程基本知识,进一步掌握汇编语言程序设计方法,提高分析问题、解决问题的综合应用能力。 设计内容 能实现加、减、乘、除的计算;该程序接受的是16进制数;执行时,需要在文件名后直接跟上计算表达式,如在命令提示符下执行结果如下: c:\tasm>js 3+2 5 2 系统需求分析 系统目标 本次汇编语言课程设计的最终目的是要实现一个简单加减乘除四则运算的计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。比如,十进制数的加减乘除四则运算。我们曾经学习过两个具体数字进行加减法运算,但是对于简单计算器用汇编语言实现难点在于这两个要做运算的数是未知的,是由自己调用中断输入到屏幕上并要用程序存储起来的数,然后才能对这两个数进行运算,而且做的是加法运算、减法运算乘法运算还是除法运算也未可知,为此我们还要判断用户所输入的运算是四则运算中的哪一个运算。此外,运算过程中的进位或是借位,选择用什么样的方式进行输出,如何实现清屏等也是要解决的问题。 主体功能 系统分析主要包括设计的功能分析和系统的流程,功能分析放在首位,每一个软件都要能满足一定的功能才有使用价值。根据功能需求来创建应用程序。 本设计的功能如下: 1、输入2个数,先判断是加减运算还是乘除运算,再进行计算 2、判断符号是否为运算符 3、回车为换行符 4、用十进制或十六进制输出运算结果 开发环境 集成环境 3 系统概要设计 系统的功能模块划分 本题目实现的模块图如图3-1所示

8086汇编指令手册

8086汇编指令手册 一、数据传输指令 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈. PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. BSWAP 交换32位寄存器里字节的顺序 XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX ) XADD 先交换再累加.( 结果在第一个操作数里) XLAT 字节查表转换. —— BX 指向一张256 字节的表的起点, AL 为表的索引值(0-255,即 0-FFH); 返回AL 为查表结果. ( [BX+AL]->AL ) 2. 输入输出端口传送指令. IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} ) OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器) 输入输出端口由立即方式指定时, 其范围是0-255; 由寄存器DX 指定时, 其范围是0-65535. 3. 目的地址传送指令. LEA 装入有效地址. 例: LEA DX,string ;把偏移地址存到DX. LDS 传送目标指针,把指针内容装入DS. 例: LDS SI,string ;把段地址:偏移地址存到DS:SI. LES 传送目标指针,把指针内容装入ES. 例: LES DI,string ;把段地址:偏移地址存到ES:DI. LFS 传送目标指针,把指针内容装入FS. 例: LFS DI,string ;把段地址:偏移地址存到FS:DI. LGS 传送目标指针,把指针内容装入GS. 例: LGS DI,string ;把段地址:偏移地址存到GS:DI. LSS 传送目标指针,把指针内容装入SS. 例: LSS DI,string ;把段地址:偏移地址存到SS:DI. 4. 标志传送指令. LAHF 标志寄存器传送,把标志装入AH. SAHF 标志寄存器传送,把AH内容装入标志寄存器.

8086汇编语言复习题解答

8086/8088汇编语言习题解答 第一章 1.1、试根据自己使用计算机的经历,列举几个必须使用或最好是使用汇编 语言编制程序的事例。 1.2、试完成下列数制间的转换 ⑴、十进制数转换为8位二进制数 十进制:100 对应二进制:01100100B 十进制:56 对应二进制:00111000B 十进制:111 对应二进制:01101111B 十进制: 120 对应二进制:01111000B 十进制: 70 对应二进制:01000110B ⑵、8位二进制数(无符号数)转换为十进制数 二进制:01010101B 对应十进制:85 二进制:10101010B 对应十进制:170 二进制:11110000B 对应十进制:240 二进制:00001111B 对应十进制:15 ⑶、十进制数转换为十六进制数 十进制:40 对应二进制:00101000B 十进制:80 对应二进制:01010000B 十进制:105 对应二进制:01101001B 十进制: 114 对应二进制:01101101B 十进制: 207 对应二进制:11001111B

1.3、试把下面用补码表示的二进制数转换为对应的十进制真值 二进制补码:01111000 对应的十进制值数真值:+120 二进制补码:11011001 对应的十进制值数真值:-39 二进制补码:10000001 对应的十进制值数真值:-127 二进制补码:10001000 对应的十进制值数真值:-120 二进制补码:00100111 对应的十进制值数真值:+39 二进制补码:11110000 对应的十进制值数真值:-16 1.4、由键盘输入字符通常都是以该字符的ASCII码形式表示的。若现在从键盘上输入十六进制数0~F,那么应如何处理才能把十六进制转换为4位二进制数0000~1111. 答:将键盘输入的数0~F的ASCII码,每输入一个字符,减去30H后,再存入内存,这样就完成了把从键盘上输入的十六进制ASCII码转换为4位二进制数0000~1111. 1.5、试分别判断下列各组数据中哪个数据最大?哪个最小? ①、A=0.101B B=0,101D C=0,101H ②、A=1011B B=1011D C=1011H 答:第①组:A=1×21-+1×23-=0.625 B=0.101 C=1×161-+163-=0.0625+0.00024414=0.06274414 所以A最大,C最小 第②组,B最大,A=B最小 1.6、现有一个二进制数10110110.若将该数看着是无符号数、原码表示的带符号数、补码表示的带符号数,它对应的十进制数的真值是多少?

汇编语言课程设计报告-打字练习程序

提供全套毕业设计,欢迎咨询 汇编语言课程设计报告 程序题目:打字练习程序 学生姓名:XX 班级:2010级计算机科学与技术专业4班学号:XXX 院系:计算机科学学院 指导教师:XXX

目录

1设计目的 本程序运行后,出现主界面,按回车键出现由26个字母组成的乱序行,这时其中任一字母落下,在键盘上敲入该字母,如果输入正确,字母消失;按回车键进入打字练习;按ESC键返回主界面;按空格键暂停;按‘E’退出。通过课程设计,主要达到以下目的: 1. 增进对汇编语言的认识,加强用汇编语言编程的能力; 2. 掌握汇编语言的中断调用功能的应用,可以用汇编语言调用各种中断调用功能,并由此实现对硬件的控制等; 3. 了解和掌握汇编语言程序设计过程、方法及实现,为以后微机原理课程的学习打下良好基础; 4. 通过课程设计可以使我们更加了解书上的知识,了解书上的语句并且能够应用自己的程序中; 5. 掌握屏幕输出显示的设计方法。 2概要设计 2.1 系统总体分析 根据题目要求可以看到有以下几部分来实现打字练习:1.由26字母乱序组成一行显示行。2.字母自动落下。3.从键盘输入的字母与落下字母相同则该字母消失,并且下一个字母自动接着落下。4.按下“Ese”键则程序返回到主界面。5.按空格键游戏暂停。6.在主界面按“E”则程序退出。打字练习的主要功能由以上六部分组成,每一部分之间的联系都是比较紧密的。对于以上及部分,最主要的部分就是第二三两个部分,这是打字练习的重点,需要详细设计其所需要的功能。 2.2主模块框图及说明

是 否 否 是 是 图2-1程序设计流程图 程序的核心模块是打字,各个模块功能的实现主要是通过键盘输入指令来融合的,主要流程是先到主界面,然后选择你想要进行的指令ENTER 进入打字界面开始打字,E退出程序,空格在打字练习时执行暂停的功能,ESC是从打字界面返回到主界面。核心模块的流程大体如下面的流程图图2-1: 3 详细设计 3.1 主模块及子模块说明 主界面是程序的初始入口,也是其他功能模块的接入点。主模块是打字模块,也是核心模块,主要通过各个键盘符来控制各个子模块之间的协调。子模块分为判断输入字符判断模块(这当中包含两个小的子模块:主界面输入字符判断和打字模块输入字符判断)、暂停模块、退出模块(这当中包含两个小的子模块:打字界面返回主界面模块和主界面退出程序模块)

8086汇编语言指令的寻址方式有哪几类

1. 8086汇编语言指令的寻址方式有哪几类?用哪一种寻址方式的指令执行速度最快? 寄存器寻址最快 7. 下面这些指令哪些是正确的?哪些是错误的?如是错误的,请说明原因。 XCHG CS , AX ;不能修改CS MOV [BX] , [1000] ;不能在两个内存单元之间直接进行数据传送 XCHG BX , IP ;不能用名字直接访问IP PUSH CS POP CS ;不允许直接修改CS值 IN BX , DX ;输入数据必须使用累加器AL或AX MOV BYTE [BX] , 1000 ;格式错误,且超范围,应为MOV word PTR [BX],1000 MOV CS , [1000];不允许直接修改CS值 20.带参数的返回指令用在什么场合?设栈顶地址为3000H,当执行RET 0006后,SP的值为多少? 利用堆栈传递参数时使用;对于近调用SP=3008H,对于远调用SP=300AH 27.设当前SS=2010H,SP=FE00H,BX=3457H,计算当前栈顶地址为多少?当执行 PUSH BX指令后,栈顶地址和栈顶2个字节的内容分别是什么? 栈顶地址:SS:SP,物理地址为:2FF00H;PUSH 完以后栈顶地址为:SS:SP=2010:FDFEH,即物理地址为:2FEFEH,内容为:57H 34H(由低地址到高地址) B P7 5. 设(DS)=3000H,(BX)=1100H,(CS)=0062H,(S1)=0002H,(31100H)=52H, (31101H)=8FH,(31162H)=6BH,(31163H)=99H,(31103H)=F6H, (32200H)=AAH,(32201H)=B6H,(32800H)=55H,(32801H)=77H,给出下列各指令执行后AX寄存器的内容: (1) MOV AX,BX (2) MOV AX,[BX] (3) MOV AX,4200H (4) MOV AX,[2800H] (5) MOV AX,1100H[BX] (6) MOV AX,[1160H+SI] 9. 分别执行下列各指令组,写出AX的内容: (1) MOV AX,93A4H NEG AX 73A4-8c5c,e689-1977 (AX)=6C5CH (2) XY DW "AB" MOV AX,XY (AX)=4142H (3) MOV AX,2B7EH MOV CX,4DB5H ADD AX,CX (AX)=7933H (4) XA DW 0BD57H MOV AX,0FBCDH AND AX,XA (AX)=B945H (5) STC MOV BX, 0B69FH MOV AX, 43A2H SBB AX, BX

(新)汇编语言课程设计四则运算

计算机与信息工程学院《汇编语言》课程设计四则运算器的设计 专业:计算机科学与技术 班级:控制11-2班 姓名: 倪天天 学号:2011025745 指导教师:郝维来 2013年6月28日

摘要 计算器是最简单的计算工具,简单计算器具有加、减、乘、除四项运算功能。想要用汇编语言实现简单的计算器,就必须通过对数据存储,寄存器的使用,加减乘除相关指令以及模块的调用等汇编语言知识进行运用,以实现一个基本功能完善,界面友好,操作简便易行的计算器。用汇编语言实现简单计算器还涉及到输入输出模块的设计,加减乘除运算的判断以及退出程序的判断的设计。通过对各种指令的合理使用,设计各个功能模块。当实现各个程序模块后,通过程序的调用最终实现一个简单的计算器。 关键词:计算器,汇编语言,四则运算,功能模块

Abstract Calculator is the easiest calculation tools, a simple calculator with addition, subtraction, multiplication, division four arithmetic functions. Want to use assembly language to achieve a simple calculator, you must pass on the data storage, register usage, addition, subtraction, and related instructions such as assembly language module calls the use of knowledge in order to achieve a basic functional, user-friendly, easy to operate easy calculator. Using assembly language to achieve a simple calculator also involves the design of input and output modules, the judgment of arithmetic operations and exit the program to judge design. Through the rational use of various commands, design various functional modules. When implementing various program modules, through a call to the ultimate realization of the program a simple calculator. Keyword:Calculator, assembly language, four arithmetic, functional modules

8086汇编指令大全.

标志寄存器:9个有效位,分 6个状态寄存器和 3个控制寄存器 CF 当执行一个加法(减法使最高位产生进位(借位时 CF=1 否则 CF=0 PF 指令执行的结果低 8位有偶数个一时, CF=1 否则 CF=0 AF 当执行一个加法(减法使运算结果低 4位向高 4位有进位(借位时 AF=1 否则 AF+0 ZF 当前运算结果为零, ZF=1 否则 ZF=0 SF 符号标志位 OF 溢出标志位 DF 方向标志位 IF 中断允许位 IF=1时响应外部中断

TF 跟踪标志位 操作数:[目的操作数(OPD ,源操作数(OPS ] ;立即操作数,寄存器操作数,存储器操作数。寻址方式: 1 寄存器寻址例:INC AX ; MOV AX , BX 2 寄存器间接寻址 (寄存器只能是 BX , DI , SI , BP ; [PA=(BX 、 DI 、 SI +DS》 4 或 BP+SS》4] 3 寄存器相对寻址 4 基址变址寻址 5 相对基址变址寻址 6 直接寻址 7 立即数寻址 i. 立即数寻址立即数寻址不能用在单操作数指令中 ii. 在双操作数中,立即数寻址方式不能用于目的操作数字段 指令系统: 1 数据传送指令 mov 注意: 不允许在两个存储单元之间直接传送数据

不允许在两个段寄存器之间传送数据 不允许用立即数直接为段寄存器赋值 不影响标志位 不允许寄存器或存储单元到除 CS 外的段寄存器 2 入栈(出栈指令 PUSH (POP 注意: PUSH 操作数不能是“立即数” POP 操作数不能是段寄存器 CS 不影响标志位 先进后出 单操作符 3 交换指令 XCHG 注意:

8086 汇编语言中断程序设计

汇编语言程序设计实验报告 学院:计算机科学与技术专业:计算机科学与技术班级:计科131

LEA DX,FNAME MOV CX,0 ;语句1 INT 21H JC EXIT MOV FNUM,AX MOV BX,AX ;语句2 MOV CX,100 MOV AH,40H LEA DX ,BUF INT 21H MOV BX,FNUM MOV AH,3EH INT 21H EXIT: MOV AH,4CH INT 21H CODE ENDS END START 使用相应的文本编辑器建立文件LAB7.asm,内容如上所示。 2.汇编并运行此程序后,在当前目录建立的文件名是什么?其内容是什么? 1>汇编: C:\masm> masm lab7; 2>连接: C:\masm> link lab7; 3>运行: C:\masm> lab7 3.若将语句1 改为mov cx,1,则运行情况与前面会有什么区别? 4.若将语句1 改为mov cx,2,则运行结果同上会有什么不同?并简要说明此语句的作用. 5.若将语句2 改为mov bx,1,则运行结果会有什么不同?简要说明则语句的作用. 实验二:编写0 号中断的处理程序,使得在除法溢出发生时,在屏幕中间显示字符串“divide error!”,然后返回到DOS。源程序下: assume cs:code code segment start: mov ax,cs mov ds,ax

mov si,offset do mov ax,0 mov es,ax mov di,200h mov cx,offset doend-offset do ;安装中断例程cld rep movsb mov word ptr es:[0],200h mov word ptr es:[2],0 ;设置中断向量表 mov dx,0ffffh mov bx,1 ;测试一下 div bx mov ax,4c00h int 21h do:jmp short dostart db 'divide error!' dostart: mov ax,0 mov ds,ax mov si,202h mov ax,0b800h mov es,ax mov di,160*12+60 mov cx,13 s: mov al,ds:[si] mov ah,15 mov es:[di],ax inc si inc di inc di loop s mov ax,4c00h int 21h doend:nop code ends end start

清华大学学习视频教程下载,有需要的千万别错过

da清华大学(英文名:Tsinghua University),地处北京西北郊繁盛的园林区,是在几处清代皇家园林的遗址上发展而成的。清华大学的前身是清华学堂,始建于1911年,曾是由美国退还的部分庚子赔款建立的留美预备学校。1912年,清华学堂更名为清华学校。1925年设立大学部,开始招收四年制大学生。1928年更名为国立清华大学,并于1929年秋开办研究院。清华大学的初期发展,虽然渗透着西方文化的影响,但学校十分重视研究中华民族的优秀文化瑰宝。 清华大学《运筹学》共40讲学习梦想家园 https://www.wendangku.net/doc/cf5992423.html,/thread-232-1-1.html 清华大学《C++语言程序设计》周登文 48讲学习梦想家园 https://www.wendangku.net/doc/cf5992423.html,/thread-371-1-1.html 清华大学《数据结构》(c语言)严蔚敏48讲学习梦想家园 https://www.wendangku.net/doc/cf5992423.html,/thread-1547-1-1.html 清华大学《计算机文化基础》视频教学共28讲学习梦想家园 https://www.wendangku.net/doc/cf5992423.html,/thread-233-1-1.html 清华大学《计算机原理》王诚 64讲学习梦想家园 https://www.wendangku.net/doc/cf5992423.html,/thread-328-1-1.html 清华大学《模式识别》林学訚 32讲学习梦想家园 https://www.wendangku.net/doc/cf5992423.html,/thread-375-1-1.html 清华大学《计算机网络体系结构》汤志忠 48讲学习梦想家园 https://www.wendangku.net/doc/cf5992423.html,/thread-374-1-1.html 清华大学《汇编语言程序设计》温冬婵 64讲学习梦想家园 https://www.wendangku.net/doc/cf5992423.html,/thread-356-1-1.html 清华大学《JA V A编程语言》许斌32讲学习梦想家园 https://www.wendangku.net/doc/cf5992423.html,/thread-354-1-1.html 清华大学《人工智能原理》朱晓燕48讲学习梦想家园 https://www.wendangku.net/doc/cf5992423.html,/thread-329-1-1.html 清华大学《编译原理》张素琴吕映芝64讲学习梦想家园 https://www.wendangku.net/doc/cf5992423.html,/thread-330-1-1.html 清华大学《软件工程》刘强48讲学习梦想家园 https://www.wendangku.net/doc/cf5992423.html,/thread-327-1-1.html 思想道德修养清华大学 https://www.wendangku.net/doc/cf5992423.html,/thread-327-1-1.html 清华大学《C++语言程序设计》周登文48讲学习梦想家园 https://www.wendangku.net/doc/cf5992423.html,/thread-2-1-2.html 清华大学《模拟电子技术》华成英56讲学习梦想家园

汇编实验之四则运算

计算机原理实验室实验报告 课程名称: 姓名学号班级成绩 设备名称及软件环境 实验名称四则运算实验日期 一.实验内容 从键盘输入一个十进制两位数的四则运算表达式, 如23*56-(8*19)/6+67-8=,编程计算表达式的值, 输出十进制结果(有可能是三位或四位十进制),+-*/位置任意。 并要求程序能反复执行直道对“还要继续吗?(y/n)”之类的提示回答“n”或“N”为止。二.理论分析或算法分析 根据题目的要求,可以把整个源程序大致划分为几个基本结构: 程序加法、减法、乘法、除法、显示结果五个部分。 首先用1号功能以输入字符的形式接收输入的算式,再判断输入字符ASCII码,如果是+、-、*、/、=或数字,则跳转到相应功能模块,并把输入的字符转为数值传入BX寄存器,在各功能模块中继续用1号功能输入字符,执行以上操作,将输入号符转为数据存入DX中,由于*、/优先级要高,加、减模块的实现中要根据输入运算符号进行将BX入栈操作,如果是相同优先级运算符,则直接将BX,DX中的数据进行相应运算,输入=则输出运算结果,这时输出字符串Continue?,用户输入y/n执行继续计算和退出操作 三.实现方法(含实现思路、程序流程图、实验电路图和源程序列表等) 主程序流程:

代码 : 根据题目的要求,可以把整个源程序大致划分为几个基本结构,程序加法、减法、乘法、除法、显示结果五个部分 源程序: CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS NEXTLINE MACRO ;显示换行宏 MOV AH,2 MOV DL,10 开始 从键盘输入字符 AL=‘+’ AL=‘-’ AL=‘*’ AL=‘=’ AL=‘/’ 输出结果 结束 从键盘输入加数并执行加运算 从键盘输入加数并执行减运算 从键盘输入加数并执行乘运算 从键盘输入加数并执行除运算 Y Y Y Y Y N N N N

常用8086汇编指令(彩色版)

8086/8088指令系统 一、数据传送指令 1.通用数据传送指令 MOV(Move)传送 PUSH(Push onto the stack)进栈 POP(Pop from the stack)出栈 XCHG(Exchange)交换 .MOV指令 格式为:MOV DST,SRC 执行的操作:(DST)<-(SRC) .PUSH进栈指令 格式为:PUSH SRC 执行的操作:(SP)<-(SP)-2 ((SP)+1,(SP))<-(SRC) .POP出栈指令 格式为:POP DST 执行的操作:(DST)<-((SP+1),(SP)) (SP)<-(SP)+2 .XCHG交换指令 格式为:XCHG OPR1,OPR2 执行的操作:(OPR1)<-->(OPR2) 2.累加器专用传送指令 IN(Input)输入 OUT(Output)输出 XLAT(Translate)换码 这组指令只限于使用累加器AX或AL传送信息. .IN输入指令 长格式为:IN AL,PORT(字节) IN AX,PORT(字) 执行的操作:(AL)<-(PORT)(字节) (AX)<-(PORT+1,PORT)(字) 短格式为:IN AL,DX(字节) IN AX,DX(字) 执行的操作:AL<-((DX))(字节) AX<-((DX)+1,DX)(字) .OUT输出指令 长格式为:OUT PORT,AL(字节) OUT PORT,AX(字)

执行的操作:(PORT)<-(AL)(字节) (PORT+1,PORT)<-(AX)(字) 短格式为:OUT DX,AL(字节) OUT DX,AX(字) 执行的操作:((DX))<-(AL)(字节) ((DX)+1,(DX))<-AX(字) 在IBM-PC机里,外部设备最多可有65536个I/O端口,端口(即外设的端口地址)为0000~FFFFH.其中前256个端口(0~FFH)可以直接在指令中指定,这就是长格式中的PORT,此时机器指令用二个字节表示,第二个字节就是端口号.所以用长格式时可以在指定中直接指定端口号,但只限于前256个端口.当端口号>=256时,只能使用短格式,此时,必须先把端口号放到DX寄存器中(端口号可以从0000到0FFFFH),然后再用IN或OUT指令来传送信息. .XLAT换码指令 格式为:XLAT OPR 或:XLAT 执行的操作:(AL)<-((BX)+(AL)) 3.有效地址送寄存器指令 LEA(Load effective address)有效地址送寄存器 LDS(Load DS with Pointer)指针送寄存器和DS LES(Load ES with Pointer)指针送寄存器和ES .LEA有效地址送寄存器 格式为:LEA REG,SRC 执行的操作:(REG)<-SRC 指令把源操作数的有效地址送到指定的寄存器中. .LDS指针送寄存器和DS指令 格式为:LDS REG,SRC 执行的操作:(REG)<-(SRC) (DS)<-(SRC+2) 把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中.该指令常指定SI寄存器. .LES指针送寄存器和ES指令 格式为:LES REG,SRC 执行的操作:(REG)<-(SRC) (ES)<-(SRC+2) 把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中.该指令常指定DI寄存器. 4.标志寄存器传送指令 LAHF(Load AH with flags)标志送AH SAHF(store AH into flags)AH送标志寄存器 PUSHF(push the flags)标志进栈 POPF(pop the flags)标志出栈 .LAHF标志送AH

8086汇编语言程序设计实验指导书

汇编语言上机实验指导书 一、概述 上机实验总学时为16学时,其中综合性实验为2学时。实验共有6项暂定为8次,每次2学时。 1.实验辅导的主要内容 实验辅导的内容包括每个实验的实验目的;实验内容;对实验的算法及实验方法的必要说明;实验准备;实验步骤;实验报告要求;实验程序及参考框图。开始的实验介绍较细,后面的实验简要介绍。 2.实验的软硬件要求 关于汇编语言程序设计的硬件要求不高,有IBM-PC/XT即可,但应有彩色显示器以便进行图形实验。软件方面应有MASM.EXE5.0版(包括LINK.EXE),与MS-DOS版本配套的DEBUG程序和EDIT.EXE编辑软件(其它编辑软件也可以)。 3.加强实践能力的培养 实验目的不光是为了验证书本理论,更重要的是对实践能力的培养。其中包括: 实际调试程序的能力,例如修改程序参数的能力,查看结果的能力,设置断点调试运行的能力等; 开发汇编语言应用程序的能力,例如应用有关汇编软件的能力,进行系统调用和BIOS功能调用的能力,进行模块程序设计的能力等。 对某一问题用不同的程序实现的能力,例如我们为每个实验提供了参考程序(或程序段),目的是让每个实验者参照样板程序将实验成功地实现,在掌握其方法后,自己改变程序或自己编制程序加以实现。 实验一汇编语言运行环境及方法、简单程序设计(2学时、验证性) 1.实验目的: (1) 熟悉汇编语言运行环境和方法 (2)了解如何使用汇编语言编制程序 (3) 熟悉DEBUG有关命令的使用方法 (4) 利用DEBUG掌握有关指令的功能 (5) 利用DEBUG运行简单的程序段 2.实验内容 (1)学会输入、编辑汇编语言程序 (2)学会对汇编语言程序进行汇编、连接和运行 (3)进入和退出DEBUG程序 (4)学会DEBUG中的D命令、E命令、R命令、T命令、A命令、G命令等的使用。对于U命令、N命令、W命令等,也应试一下。 3.实验准备 (1)仔细阅读有关汇编语言环境的内容,事先准备好使用的例子。 (2)准备好源程序清单、设计好调试步骤、测试方法、对运行结果的分析。 (3) 编写一个程序:比较2个字符串所含的字符是否相同。若相同则显示’Match.’,否则显示’No match!’;(1)仔细阅读有关DEBUG 命令的内容,对有关命令,都要事先准备好使用的例子。 4.实验步骤 (1)在DOS提示符下,进入MASM目录。 (2)在MASM目录下启动EDIT编辑程序,输入源程序,并对其进行汇编、连接和运行。 ①调用edit输入、编辑源程序并保存在指定的目录中;例:edit abc.asm ②用汇编程序masm对源程序汇编产生目标文件obj。例:masm abc 不断修改错误,直至汇编通过为止。 ③用连接程序link产生执行文件exe.例:link abc ④执行程序 可直接从DOS执行程序,即在DOS环境中,输入文件名即可。 (3)详细记录每一步所用的命令,以及查看结果的方法和具体结果。 5.实验报告要求 (1)源程序清单。 (2) 如何启动和退出EDIT程序。 (3) 如何对源程序进行汇编及编辑。 (4)如何启动和退出DEBUG程序。

相关文档
相关文档 最新文档