用c语言编写一个简单的组译器

sk_soju 2008-04-02 12:10:38
用c语言编写一个简单的组译器
要求 :1 一行一行读取输入文件
2 将输入文件的每一行转化成记忆码,操作码,标签等
3 对无效的指令或者操作码进行操作
运行程序的时候输入指令为
./assembler <输入文件> <输出文件>

小弟初学,看到题目很迷茫,望各位高手给个简单的例子就行,先谢过。

...全文
131 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
meiZiNick 2008-05-01
  • 打赏
  • 举报
回复
没遇到过这种情况.
UltraBejing 2008-05-01
  • 打赏
  • 举报
回复
我也想知道,正在找這方面的資料~~~~~
knowledge_Is_Life 2008-04-30
  • 打赏
  • 举报
回复
以后需再关注,现在先帮你顶一下
dongyi940333 2008-04-03
  • 打赏
  • 举报
回复
学习了,谢谢jennyvenus
sk_soju 2008-04-03
  • 打赏
  • 举报
回复
这个函数就是用来做加减法的么
运行的时候输入
./assembler <输入文件> <输出文件>
这里的输入和输出都是些啥文件啊
huxiaolai 2008-04-03
  • 打赏
  • 举报
回复
看不懂,没学到什么,
顶下
用户 昵称 2008-04-02
  • 打赏
  • 举报
回复
    If Decom(i) = "WORD" And Decom(i + 1) = "PTR" Then
'[]=============[]
'[]列举可能的方式
'[]mov word ptr [1000h],1
'[]mov word ptr [si],1
'[]mov word ptr [si+d8],1
'[]mov word ptr [si+d16],1
'[]mov word ptr [bx+si],1
'[]mov word ptr [bx+si+d8],1
'[]mov word ptr [bx+si+d16],1
'[]=============[]
If Is_Dir_Mem(i + 2) Then
ADD_OR_SUB = WORDPTR_DIRMEM_0(OPT, Decom(i + 3), Decom(i + 6))
ElseIf Is_InDir_Mem(i + 2) Then
ADD_OR_SUB = WORDPTR_INDIRMEM_0(OPT, Decom(i + 3), Decom(i + 6))
ElseIf Is_InDir_Mem8(i + 2) Then
ADD_OR_SUB = WORDPTR_INDIRMEM8_0(OPT, Decom(i + 3), Decom(i + 4), Decom(i + 5), Decom(i + 8))
ElseIf Is_InDir_Mem16(i + 2) Then
ADD_OR_SUB = WORDPTR_INDIRMEM16_0(OPT, Decom(i + 3), Decom(i + 4), Decom(i + 5), Decom(i + 8))
ElseIf Is_Base_Mem(i + 2) Then
ADD_OR_SUB = WORDPTR_BASEMEM_0(OPT, Decom(i + 3), Decom(i + 5), Decom(i + 8))
ElseIf Is_Base_Mem8(i + 2) Then
ADD_OR_SUB = WORDPTR_BASEMEM8_0(OPT, Decom(i + 3), Decom(i + 5), Decom(i + 6), Decom(i + 7), Decom(i + 9))
ElseIf Is_Base_Mem16(i + 2) Then
ADD_OR_SUB = WORDPTR_BASEMEM16_0(OPT, Decom(i + 3), Decom(i + 5), Decom(i + 6), Decom(i + 7), Decom(i + 9))
End If
End If
'--------------------------------------------------
'++++++++++++++++++++++++++++++++++++++++++++++++++
If IsWord(Decom(i)) Then
If IsWord(Decom(i + 2)) Then
If OPT = "XCHG" And Decom(i) = "AX" And Decom(i + 2) = "AX" Then
ADD_OR_SUB = "90"
Else
ADD_OR_SUB = word1 & WORD_WORD(Decom(i), Decom(i + 2))
End If
ElseIf IsImme(i + 2) Then
ADD_OR_SUB = WORD_IMME_0(OPT, Decom(i), Decom(i + 2))
ElseIf Is_Dir_Mem(i + 2) Then
ADD_OR_SUB = WORD_DIR_MEM_0(OPT, Decom(i), Decom(i + 3))
ElseIf Is_InDir_Mem(i + 2) Then
ADD_OR_SUB = word2 & WORD_INDIR_MEM(Decom(i), Decom(i + 3))
ElseIf Is_InDir_Mem8(i + 2) Then
ADD_OR_SUB = word2 & WORD_INDIR_MEM8(Decom(i), Decom(i + 3), Decom(i + 4), Decom(i + 5))
ElseIf Is_InDir_Mem16(i + 2) Then
ADD_OR_SUB = word2 & WORD_INDIR_MEM16(Decom(i), Decom(i + 3), Decom(i + 4), Decom(i + 5))
ElseIf Is_Base_Mem(i + 2) Then
ADD_OR_SUB = word2 & WORD_BASE_MEM(Decom(i), Decom(i + 3), Decom(i + 5))
ElseIf Is_Base_Mem8(i + 2) Then
ADD_OR_SUB = word2 & WORD_BASE_MEM8(Decom(i), Decom(i + 3), Decom(i + 5), Decom(i + 6), Decom(i + 7))
ElseIf Is_Base_Mem16(i + 2) Then
ADD_OR_SUB = word2 & WORD_BASE_MEM16(Decom(i), Decom(i + 3), Decom(i + 5), Decom(i + 6), Decom(i + 7))
End If
End If
'----------------------------------------------------------------
'++++++++++++++++++++++++++++++++++++++++++++++++++
If IsByte(Decom(i)) Then
If IsByte(Decom(i + 2)) Then
ADD_OR_SUB = byte1 & BYTE_BYTE(Decom(i), Decom(i + 2))
ElseIf IsImme(i + 2) Then
ADD_OR_SUB = BYTE_IMME_0(OPT, Decom(i), Decom(i + 2))
ElseIf Is_Dir_Mem(i + 2) Then
ADD_OR_SUB = BYTE_DIR_MEM_0(OPT, Decom(i), Decom(i + 3))
ElseIf Is_InDir_Mem(i + 2) Then
ADD_OR_SUB = byte2 & BYTE_INDIR_MEM(Decom(i), Decom(i + 3))
ElseIf Is_InDir_Mem8(i + 2) Then
ADD_OR_SUB = byte2 & BYTE_INDIR_MEM8(Decom(i), Decom(i + 3), Decom(i + 4), Decom(i + 5))
ElseIf Is_InDir_Mem16(i + 2) Then
ADD_OR_SUB = byte2 & BYTE_INDIR_MEM16(Decom(i), Decom(i + 3), Decom(i + 4), Decom(i + 5))
ElseIf Is_Base_Mem(i + 2) Then
ADD_OR_SUB = byte2 & BYTE_BASE_MEM(Decom(i), Decom(i + 3), Decom(i + 5))
ElseIf Is_Base_Mem8(i + 2) Then
ADD_OR_SUB = byte2 & BYTE_BASE_MEM8(Decom(i), Decom(i + 3), Decom(i + 5), Decom(i + 6), Decom(i + 7))
ElseIf Is_Base_Mem16(i + 2) Then
ADD_OR_SUB = byte2 & BYTE_BASE_MEM16(Decom(i), Decom(i + 3), Decom(i + 5), Decom(i + 6), Decom(i + 7))
End If
End If
'----------------------------------------------------------------
If Decom(i) = "[" Then
If Is_Dir_Mem(i) Then
If IsByte(Decom(i + 4)) Then
ADD_OR_SUB = DIR_MEM_BYTE_0(OPT, Decom(i + 1), Decom(i + 4))
ElseIf IsWord(Decom(i + 4)) Then
ADD_OR_SUB = DIR_MEM_WORD_0(OPT, Decom(i + 1), Decom(i + 4))
End If
ElseIf Is_InDir_Mem(i) Then
If IsByte(Decom(i + 4)) Then
ADD_OR_SUB = mem1 & INDIR_MEM_BYTE(Decom(i + 1), Decom(i + 4))
ElseIf IsWord(Decom(i + 4)) Then
ADD_OR_SUB = mem2 & INDIR_MEM_WORD(Decom(i + 1), Decom(i + 4))
End If
ElseIf Is_InDir_Mem8(i) Then
If IsByte(Decom(i + 6)) Then
ADD_OR_SUB = mem1 & INDIR_MEM8_BYTE(Decom(i + 1), Decom(i + 2), Decom(i + 3), Decom(i + 6))
ElseIf IsWord(Decom(i + 6)) Then
ADD_OR_SUB = mem2 & INDIR_MEM8_WORD(Decom(i + 1), Decom(i + 2), Decom(i + 3), Decom(i + 6))
End If
ElseIf Is_InDir_Mem16(i) Then
If IsByte(Decom(i + 6)) Then
ADD_OR_SUB = mem1 & INDIR_MEM16_BYTE(Decom(i + 1), Decom(i + 2), Decom(i + 3), Decom(i + 6))
ElseIf IsWord(Decom(i + 6)) Then
ADD_OR_SUB = mem2 & INDIR_MEM16_WORD(Decom(i + 1), Decom(i + 2), Decom(i + 3), Decom(i + 6))
End If
ElseIf Is_Base_Mem(i) Then
If IsByte(Decom(i + 6)) Then
ADD_OR_SUB = mem1 & BASE_MEM_BYTE(Decom(i + 1), Decom(i + 3), Decom(i + 6))
ElseIf IsWord(Decom(i + 6)) Then
ADD_OR_SUB = mem2 & BASE_MEM_WORD(Decom(i + 1), Decom(i + 3), Decom(i + 6))
End If
ElseIf Is_Base_Mem8(i) Then
If IsByte(Decom(i + 8)) Then
ADD_OR_SUB = mem1 & BASE_MEM8_BYTE(Decom(i + 1), Decom(i + 3), Decom(i + 4), Decom(i + 5), Decom(i + 8))
ElseIf IsWord(Decom(i + 8)) Then
ADD_OR_SUB = mem2 & BASE_MEM8_WORD(Decom(i + 1), Decom(i + 3), Decom(i + 4), Decom(i + 5), Decom(i + 8))
End If
ElseIf Is_Base_Mem16(i) Then
If IsByte(Decom(i + 8)) Then
ADD_OR_SUB = mem1 & BASE_MEM16_BYTE(Decom(i + 1), Decom(i + 3), Decom(i + 4), Decom(i + 5), Decom(i + 8))
ElseIf IsWord(Decom(i + 8)) Then
ADD_OR_SUB = mem2 & BASE_MEM16_WORD(Decom(i + 1), Decom(i + 3), Decom(i + 4), Decom(i + 5), Decom(i + 8))
End If
End If
End If


这只是当时的一个函数。
用户 昵称 2008-04-02
  • 打赏
  • 举报
回复
        Case "LDS"
word1 = "C5"
word2 = "C5"
Case "LES"
word1 = "C4"
word2 = "C4"
Case "LEA"
word1 = "8D"
word2 = "8D"
Case Else
End Select
If (Decom(i) = "BYTE" Or Decom(i) = "DWORD") And Decom(i + 1) = "PTR" Then
'[]=============[]
'[]列举可能的方式
'[]mov byte ptr [1000h],1
'[]mov byte ptr [si],1
'[]mov byte ptr [si+d8],1
'[]mov byte ptr [si+d16],1
'[]mov byte ptr [bx+si],1
'[]mov byte ptr [bx+si+d8],1
'[]mov byte ptr [bx+si+d16],1
'[]=============[]
If Is_Dir_Mem(i + 2) Then
ADD_OR_SUB = BYTEPTR_DIRMEM_0(OPT, Decom(i + 3), Decom(i + 6))
ElseIf Is_InDir_Mem(i + 2) Then
ADD_OR_SUB = BYTEPTR_INDIRMEM_0(OPT, Decom(i + 3), Decom(i + 6))
ElseIf Is_InDir_Mem8(i + 2) Then
ADD_OR_SUB = BYTEPTR_INDIRMEM8_0(OPT, Decom(i + 3), Decom(i + 4), Decom(i + 5), Decom(i + 8))
ElseIf Is_InDir_Mem16(i + 2) Then
ADD_OR_SUB = BYTEPTR_INDIRMEM16_0(OPT, Decom(i + 3), Decom(i + 4), Decom(i + 5), Decom(i + 8))
ElseIf Is_Base_Mem(i + 2) Then
ADD_OR_SUB = BYTEPTR_BASEMEM_0(OPT, Decom(i + 3), Decom(i + 5), Decom(i + 8))
ElseIf Is_Base_Mem8(i + 2) Then
ADD_OR_SUB = BYTEPTR_BASEMEM8_0(OPT, Decom(i + 3), Decom(i + 5), Decom(i + 6), Decom(i + 7), Decom(i + 9))
ElseIf Is_Base_Mem16(i + 2) Then
ADD_OR_SUB = BYTEPTR_BASEMEM16_0(OPT, Decom(i + 3), Decom(i + 5), Decom(i + 6), Decom(i + 7), Decom(i + 9))
End If
End If
End Function
用户 昵称 2008-04-02
  • 打赏
  • 举报
回复
我以前写过VB的。当时虽然知道有规则,但是并没有按规则写,都是逐个匹配翻译的。

Public Function ADD_OR_SUB(ByVal OPT As String) As String
Dim i As Long
Dim word1 As String
Dim word2 As String
Dim byte1 As String
Dim byte2 As String
Dim mem1 As String
Dim mem2 As String
i = 4
Select Case OPT
Case "ADC"
word1 = "11"
word2 = "13"
byte1 = "10"
byte2 = "12"
mem1 = "10"
mem2 = "11"
Case "ADD"
word1 = "01"
word2 = "03"
byte1 = "00"
byte2 = "02"
mem1 = "00"
mem2 = "01"
Case "AND"
word1 = "21"
word2 = "23"
byte1 = "20"
byte2 = "22"
mem1 = "20"
mem2 = "21"
Case "CMP"
word1 = "39"
word2 = "3B"
byte1 = "38"
byte2 = "3A"
mem1 = "38"
mem2 = "39"
Case "OR"
word1 = "09"
word2 = "0B"
byte1 = "08"
byte2 = "0A"
mem1 = "08"
mem2 = "09"
Case "SBB"
word1 = "19"
word2 = "1B"
byte1 = "18"
byte2 = "1A"
mem1 = "18"
mem2 = "19"
Case "SBB"
word1 = "29"
word2 = "2B"
byte1 = "28"
byte2 = "2A"
mem1 = "28"
mem2 = "29"
Case "TEST"
word1 = "85"
word2 = "85"
byte1 = "84"
byte2 = "84"
mem1 = "84"
mem2 = "85"
Case "XOR"
word1 = "31"
word2 = "33"
byte1 = "30"
byte2 = "32"
mem1 = "30"
mem2 = "31"
Case "XCHG"
word1 = "87"
word2 = "87"
byte1 = "86"
byte2 = "86"
mem1 = "86"
mem2 = "87"
sk_soju 2008-04-02
  • 打赏
  • 举报
回复
关键问题是我现在都不知道怎样入手 有什么最简单的例子可以借用一下的么
用户 昵称 2008-04-02
  • 打赏
  • 举报
回复
俺正在做这个玩,其实很复杂的,最麻烦的就是各种指令如何转换成机器码,虽然有一定的规则,然后实现起来还是得逐个分析。
C 语言编程常见问题解答 【作者】[美]Paul S.R. Chisholm 译:张芳妮 吕 波 【出版社】清华大学出版社 C语言编程常见问题解答(目录) 第l章 C语言 1. 1 什么是局部程序块(local block)? 1. 2 可以把变量保存在局部程序块中吗? 1. 3 什么时候用一条switch语句比用多条if语句更好? 1. 4 switch语句必须包含default分支吗? 1. 5 switch语句的最后—个分支可以不要break语句吗? 1. 6 除了在for语句中之外,在哪些情况下还要使用逗号运算? 1. 7 怎样才能知道循环是否提前结束了? 1. 8 goto,longjmp()和setjmp()之间有什么区别? 1. 9 什么是左值(lvaule)? 1. 10 数组(array)可以是左值吗? 1. 11 什么是右值(rvaule)? 1. 12 运算符的优先级总能保证是“自左至右”或“自右至左”的顺序吗? 1. 13 ++var和var++有什么区别? 1. 14 取模运算符(modulusoperator)“%”的作用是什么? 第2章 变量和数据存储 2. 1 变量存储在内存(memory)中的什么地方? 2. 2 变量必须初始化吗? 2. 3 什么是页抖动(pagethrashing)? 2. 4 什么是const指针? 2. 5 什么时候应该使用register修饰符?它真的有用吗? 2. 6 什么时候应该使用volatile修饰符? 2. 7 一个变量可以同时被说明为const和volatile吗? 2. 8 什么时候应该使用const修饰符? 2. 9 浮点数比较(floating—point comparisons)的可靠性如何? 2. 10 怎样判断一个数字型变量可以容纳的最大值? 2. 11 对不同类型的变量进行算术运算会有问题吗? 2. 12 什么是运算符升级(operator promotion)? 2. 13 什么时候应该使用类型强制转换(typecast)? 2. 14 什么时候不应该使用类型强制转换(typecast)? 2. 15 可以在头文件中说明或定义变量吗? 2. 16 说明一个变量和定义一个变量有什么区别? 2. 17 可以在头文件中说明static变量吗? 2.18 用const说明常量有什么好处? 第3章 排序与查找 排 序 查 找 排序或查找的性能 3.1 哪一种排序方法最方便? 3.2 哪一种排序方法最快? 3.3 当要排序的数据集因太大而无法全部装入内存时,应怎样排序? 3.4 哪一种查找方法最方便? 3.5 哪一种查找方法最快? 3.6 什么是哈希查找? 3.7 怎样对链表进行排序? 3.8 怎样查找链表中的数据? 第4章 数据文件 4.1 当errno为一个非零值时,是否有错误发生? 4.2 什么是流(stream)? 4.3 怎样重定向—个标准流? 4.4 怎样恢复一个重定向了的标准流? 4.5 stdout能被强制打印到非屏幕设备上吗? 4.6 文本模式(text mode)和二进制模式(binary mode)有什么区别? 4.7 怎样判断是使用流函数还是使用低级函数? 4.8 怎样列出某个目录下的文件? 4.9 怎样列出—个文件的日期和时间? 4.10 怎样对某个目录下的文件名进行排序? 4.1l 怎样判断一个文件的属性? 4.12 怎样查看PATH环境变量? 4.13 怎样打开一个同时能被其它程序修改的文件? 4.14 怎样确保只有你的程序能存取一个文件? 4.15 怎样防止其它程序修改你正在修改的那部分文件内容? 4.16 怎样—次打开20个以上的文件? 4.17 怎样避开"Abort,Retry,Fail"消息? 4.18 怎样读写以逗号分界的文本? 第5章 编译预处理 5.1 什么是宏(macro)?怎样使用宏? 5.2 预处理程序(preprocessor)有什么作用? 5.3 怎样避免多次包含同—个头文件? 5.4 可以用#include指令包含类型名不是“.h”的文件吗? 5.5 用#define指令说明常量有什么好处? 5.6 用enum关键字说明常量有什么好处? 5.7 与用#define指令说明常量相比,用enum关键字说明常量有什么好处? 5.8 如何使部分程序在演示版中失效? 5.9 什么时候应该用宏代替函数? 5.10 使用宏更好,还是使用函数更好? 5.11 在程序中加入注释的最好方法是什么? 5.12 #include和#include“file”有什么不同? 5.13 你能指定在编译时包含哪一个头文件吗? 5.14 包含文件可以嵌套吗? 5.15 包含文件最多可以嵌套几层? 5.16 连接运算符“##”有什么作用? 5.17 怎样建立对类型敏感的宏? 5.18 什么是标准预定义宏? 5.19 怎样才能使程序打印出发生错误的行号? 5.20 怎样才能使程序打印出发生错误的源文件名? 5.2l 怎样判断一个程序是用C编译程序环是用C++编译程序编译的? 5.22 预处理指令#pragma有什么作用? 5.23 #line有什么作用? 5.24 标准预定义宏_FILE_有什么作用? 5.25 怎样在程序中打印源文件名? 5.26 标准预定义宏_LINE_有什么作用? 5.27 怎样在程序中打印源文件的当前行号? 5.28 标准预定义宏_DATE_和_TIME_有什么作用? 5.29 怎样在程序中打印编译日期和时间? 5.30 怎样判断一个程序是否遵循ANSIC标准? 5.31 怎样取消一个已定义的宏? 5.32 怎样检查一个符号是否已被定义? 5.33 C语言提供哪些常用的宏? 第6章 字符串操作 6.l 串拷贝(strcpy)和内存拷贝(memcpy)有什么不同?它们适合于在哪种情况下使用? 6.2 怎样删去字符串尾部的空格? 6.3 怎样删去字符串头部的空格? 6.4 怎样使字符串右对齐? 6.5 怎样将字符串打印成指定长度? 6.6 怎样拷贝字符串的一部分? 6.7 怎样将数字转换为字符串? 6.8 怎样将字符串转换为数字? 6.9 怎样打印字符串的一部分? 6.10 怎样判判断两个字符串是否相同? 第7章 指针和内存分配 7.1 什么是间接引用(indirection)? 7.2 最多可以使用几层指针? 7.3 什么是空指针? 7.4 什么时候使用空指针? 7.5 什么是void指针? 7.6 什么时候使用void指针? 7.7 两个指针可以相减吗?为什么? 7.8 把一个值加到一个指针上意味着什么? 7.9 NULL总是被定义为0吗? 7.10 NULL总是等于0吗? 7.11 用指针作if语句的条件表达式意味着什么? 7.12 两个指针可以相加吗?为什么? 7.13 怎样使用指向函数的指针? 7.14 怎样用指向函数的指针作函数的参数? 7.15 数组的大小可以在程序运行时定义吗? 7.16 用malloc()函数更好还是用calloc()函数更好? 7.17 怎样说明一个大于64KB的数组? 7.18 far和near之间有什么区别? 7.19 什么时候使用far指针? 7.20 什么是栈(stack)? 7.21 什么是堆(heap)? 7.22 两次释放一个指针会导致什么结果? 7.23 NULL和NUL有什么不同? 7.24 为什么不能给空指针赋值?什么是总线错误、内存错误和内存信息转储? 7.25 怎样确定一块已分配的内存的大小? 7.26 free()函数是怎样知道要释放的内存块的大小的? 7.27 可以对void指针进行算术运算吗? 7.28 怎样打印一个地址? 第8章 函数 8.1 什么时候说明函数? 8.2 为什么要说明函数原型? 8.3 一个函数可以有多少个参数? 8.4 什么是内部函数? 8.5 如果一个函数没有返回值,是否需要加入return语句? 8.6 怎样把数组作为参数传递给函数? 8.7 在程序退出main()函数之后,还有可能执行一部分代码吗? 8.8 用PASCAL修饰符说明的函数与普通C函数有什么不同? 8.9 exit()和return有什么不同? . 第9章 数组 9.1 数组的下标总是从0开始吗? 9.2 可以使用数组后面第—个元素的地址吗? 9.3 为什么要小心对待位于数组后面的那些元素的地址呢? 9.4 在把数组作为参数传递给函数时,可以通过sizeof运算符告诉函数数组的大小吗? 9.5 通过指针或带下标的数组名都可以访问数组中的元素,哪一种方式更好呢? 9.6 可以把另外一个地址赋给一个数组名吗? 9.7 array_name和&array;_name有什么不同? 9.8 为什么用const说明的常量不能用来定义一个数组的初始大小? 9.9 字符串和数组有什么不同? 第10章 位(bit)和字节(byte) 10.1 用什么方法存储标志(flag)效率最高? 10.2 什么是“位屏蔽(bit masking)”? 10.3 位域(bit fields)是可移植的吗? 10.4 移位和乘以2这两种方式中哪一种更好? 10.5 什么是高位字节(high-order byte)和低位字节(low-order byte)? 10.6 16位和32位的数是怎样存储的? 第11章 调试 11.1 如果我运行的程序挂起了,应该怎么办? 11.2 如何检测内存漏洞(leak)? 11.3 调试程序的最好方法是什么? 11.4 怎样调试TSR程序? 11.5 怎样获得一个能报告条件失败的程序? 第12章 标准库函数 12.1 为什么应该使用标准库函数而不要自己编写函数? 12.2 为了定义我要使用的标准库函数,我需要使用哪些头文件? 12.3 怎样编写参数数目可变的函数? 12.4 独立(free—standing)环境和宿主(hosted)环境之间有什么区别? 12.5 对字符串进行操作的标准库函数有哪些? 12.6 对内存进行操作的标准库函数有哪些? 12.7 怎样判断一个字符是数字、字母或其它类别的符号? 12.8 什么是“局部环境(locale)”? 12.9 有没有办法从一个或多个函数中跳出? 12.10 什么是信号(signal)?用信号能做什么? 12.11 为什么变量名不能以下划线开始? 12.12 为什么编译程序提供了两个版本的malloc()函数? 12.13 适用于整数和浮点数的数学函数分别有哪些? 12.14 什么是多字节字符(multibyte characters)? 12.15 怎样操作由多字节字符组成的字符串? 第13章 时间和日期 13.1 怎样把日期存储到单个数字中?有这方面的标准吗? 13.2 怎样把时间存储到单个数字中?有这方面的标准吗? 13.3 为什么定义了这么多不同的时间标准? 13.4 存储日期的最好方法是哪一种? 13.5 存储时间的最好方法是哪一种? 第14章 系统调用 14.1 怎样检查环境变量(environment variables)的值? 14.2 怎样在程序中调用DOS函数? 14.3 怎样在程序中调用BIOS函数? 14.4 怎样在程序中存取重要的DOS内存位置? 14.5 什么是BIOS? 14.6 什么是中断? 14.7 使用ANSI函数和使用BIOS函数,哪种方式更好? 14.8 可以通过BIOS把显示模式改为VGA图形模式吗? 14.9 运算符的优先级总能起作用吗(从左至右,从右至左)? 14.10 函数参数的类型必须在函数头部或紧跟在其后说明吗?为什么? 14.11 程序应该总是包含main()的一个原型吗? 14.12 main()应该总是返回一个值吗? 14.13 可以通过BIOS控制鼠标吗? 第15章 可移植性 15.1 编译程序中的C++扩充功能可以用在C程序中吗? 15.2 C++和C有什么区别? 15.3 在C程序中可以用“∥”作注释符吗? 15.4 char,short,int和long类型分别有多长? 15.5 高位优先(big-endian)与低位优先(little—endian)的计算机有什么区别? 第16章 ANSI/ISO标准 16.1 运算符的优先级总能起作用吗? 16.2 函数参数类型必须在函数参数表中或紧跟其后的部分中说明吗? 16.3 程序中必须包含main()的原型吗? 16.4 main()应该总是返回一个值吗? 第17章 用户界面——屏幕和键盘 17.1 为什么直到程序结束时才看到屏幕输出? 17.2 怎样在屏幕上定位光标? 17.3 向屏幕上写数据的最简单的方法是什么? 17.4 向屏幕上写文本的最快的方法是什么? 17.5 怎样防止用户用Ctr+Break键中止程序的运行? 17.6 怎样才能只得到一种特定类型的数据,例如字符型数据? 17.7 为什么有时不应该用scanf()来接收数据? 17.8 怎样在程序中使用功能键和箭头键? 17.9 怎样防止用户向一个内存区域中输入过多的字符? 17.10 怎样用0补齐一个数字? 17.11 怎样才能打印出美元一美分值? 17.12 怎样按科学记数法打印数字? 17.13 什么是ANSI驱动程序? 17.14 怎样通过ANSI驱动程序来清屏? 17.15 怎样通过ANSI驱动程序来存储光标位置? 17.16 怎样通过ANSI驱动程序来恢复光标位置? 17.17 怎样通过ANSI驱动程序来改变屏幕颜色? 17.18 怎样通过ANSI驱动程序来写带有颜色的文本? 17.19 怎样通过ANSI驱动程序来移动光标? 第18章 程序的编写和编译 18.1 程序是应该写成一个源文件还是多个源文件? 18.2 各种存储模式之间有什么区别? 18.3 最常使用的存储模式有哪些? 18.4 应该使用哪种存储模式? 18.5 怎样生成一个".COM"文件? 18.6 ".COM"文件有哪些地方优于".EXE"文件? 18.7 当一个库被连接到目标上时,库中的所有函数是否都会被加到一个".EXE"文件中? 18.8 可以把多个库函数包含在同一个源文件中吗? 18.9 为什么要建立一个库? 18.10 如果一个程序包含多个源文件,怎样使它们都能正常工作? 18.11 连接过程中出现"DGROUP:group exceeds 64K"消息是怎么回事? 18.12 怎样防止程序用尽内存? 18.13 如果程序太大而不能在DOS下运行,怎样才能使它在DOS下运行呢? 18.14 怎样才能使DOS程序获得超过640KB的可用内存呢? 18.15 近程型(near)和远程型(far)的区别是什么? 第19章编程风格和标准 19.1 可以在变量名中使用下划线吗? 19.2 可以用变量名来指示变量的数据类型吗? 19.3 使用注释会影响程序的速度、大小或效率吗? 19.4 使用空白符会影响程序的速度、大小或效率吗? 19.5 什么是骆驼式命名法? 19.6 较长的变量名会影响程序的速度、大小或效率吗? 19.7 给函数命名的正确方法是什么? 19.8 使用大括号的正确方法是什么? 19.9 一个变量名应该使用多少个字母?ANSI。标准允许有多少个有效字符? 19.10 什么是匈牙利式命名法?应该使用它吗? 19.11 什么是重复处理(iterative processing)? 19.12 什么是递归(recursion)?怎样使用递归? 19.13 在C语言中,表示真和假的最好方法是什么? 19.14 空循环(null loops)和无穷循环(infinite loops)有什么区别? 19.15 continue和break有什么区别? 第20章 杂项(Miscellaneous) 20.1 怎样获得命令行参数? 20.2 程序总是可以使用命令行参数吗? 20.3“异常处理(exception handling)”和“结构化异常处理(structured exception handling)”有什么区别? 20.4 怎样在DOS程序中建立一个延时器(delay timer)? 20.5 Kernighan和Ritchie是谁? 20.6 怎样产生随机数? 20.7 什么时候应该使用32位编译程序? 20.8 怎样中断一个Windows程序? 20.9 为什么要使用静态变量? 20.10 怎样在一个程序后面运行另一个程序? 20.11 怎样在一个程序执行期间运行另一个程序? 20.12 怎样把数据从一个程序传给另一个程序? 20.13 怎样判断正在运行的程序所在的目录? 20.14 怎样找到程序中的重要文件(数据库,配置文件,等等)? 20.15 本书的有些例子程序有许多缺陷,为什么不把它们写得更好? 20.16 怎样使用Ctr+Break失效? 20.17 可以使热启动(Ctrl+Alt+Delete)失效吗? 20.18 怎样判断一个字符是否是一个字母? 20.19 怎样判断一个字符是否是一个数字? 20.20 怎样把一个十六进制的值赋给一个变量? 20. 21 怎样把一个八进制的值赋给一个变量? 20.22 什么是二进制? 20.23 什么是八进制? 20.24 什么是十六进制? 20.25 什么是换码符(escape characters)? 附 录 常用函数的包含文件
【作 者】:(美国)普雷斯等著、胡健伟等译;胡健伟译 【原/又名】:Numerical Recipes in C++: The Art of Scientific Computing, Second Edition 【丛编项】:国外计算机科学教材系列 【装帧项】:平装 开 / 723 【出版项】:电子工业出版社 / 2005-01-01 【ISBN号】:75053871** 【原书定价】:¥68.00  【主题词】:计算机-计算机科学理论与基础知识-计算理论-算法 本书由美国洛斯阿拉莫斯国家实验室(Los Alamos National Laboratory)主任WilliamH.Press和其他三位从事科学计算的学者合著。本书及其姊妹篇(C版、FORTRAN版以及Pascal版)已被美国哈佛大学、美国康奈尔大学、英国剑桥大学等国际著名大学选为本科生和研究生数值计算课程的教材。 本书主要特点: ·选材内容丰富。包含了当代科学计算过程中涉及的大量内容:求特殊函数值、随机数、排序、最优化、快速傅里叶变换、谱分析、小波变换、统计描述和数据建模、偏微分方程数值解、若干编码算法和任意精度计算等。 ·科学性和实用性统一。不仅对每种算法进行了数学分析和比较,而且根据作者经验对算法给出了评论和建议,并在此基础上提供了用C++语言编写的实用程序。 本书选材内容丰富,除了通常数值方法课程的内容外,还包含当代科学计算大量用到的专题,如求特殊函数值、随机数、排序、最优化、快速傅里叶变换、谱分析、小波变换、统计描述和数据建模、常微分方程和偏微分方程数值解、若干编码算法和任意精度的计算等。 本书科学性和实用性统一。每个专题中,不仅对每种算法给出了数学分析和比较,而且根据作者的经验对算法做出了评论和建议,并在此基础上给出了用C++语言编写的实用程序。读者可以很方便地直接套用这些程序,还可以结合特定的需要进行修改。本书中包含的345个程序构成了C++语言的数值计算程序库。
浅谈电子看板的设计 摘 要:电子看板是一种专门用于记录显示生产数据的产品,主要由单片机和显示模 块组成,显示模块分别是计划产量、实际产量(当前产量)和达成率。另外,还带有四 个按键,其中有三个是用来进行数值调整的,另一个仿真计数脉冲输入。软件c语言编写 ,使用medwin集成开发环境,软硬件经proteus6.7仿真通过。 关键词:电子看板;单片机;at89c51;c语言 看板是日本丰田汽车公司于20世纪50年代从超级市场的运行机制中得到启示而发明的一 种管理方式,是基于及时生产的一种管理手段,它是以降低成本为基本目的,在生产系 统的各个环节全面展开的一种使生产有效进行的新型生产方式,看板犹如巧妙连接各道 工序的神经而发挥着重要作用。经过近50年的发展和完善,从机械方式到全电子方式, 目前已经在很多方面都发挥着重要的机能。 一、总体方案设计 二、单片机选型 单片机是本设计的核心部件,单片机的选型很大程度上会影响整个设计方案。我们在课 堂上学的是mcs-51单片机,mcs-51单片机最经典,年龄比我们大,在我国乃至全世界 仍有着广大的用户群。近年来,各种新型的、性能优异的单片机不断涌现,大有取代mc s-51的趋势,但mcs-51的统治地位暂不会动摇。 at89c51是一种带4k字节闪烁可编程、可擦除只读存储器(fperom—falsh programmabl e and erasable read only memory)的低电压、高性能cmos8位微处理器,俗称单 片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用atmel高密度非易失 存储器制造技术制造,与工业标准的mcs- 51指令集和输出管脚相兼容。由于将多功能8位cpu和闪烁存储器组合在单个芯片中,at mel的at89c51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉 的方案。 三、开发工具和环境 1.编程语言及编译器 本设计中,我选用的是medwin。medwin是万利电子有限公司开发的一款集编辑、编译/汇 编、在线及模拟调试为一体的单片机高性能集成开发环境(integrated development  environment, ide)。因其强大的功能、简洁的界面、方便的操作而备受单片机学习 者的喜爱,在单片机学习开发者中流传甚广。 2.目标代码仿真工具 c编译器编译产生的目标代码,要烧录到单片机中才能运行。proteus(海神)的isis是 一款labcenter出品的电路分析实物仿真系统,可仿真各种电路和ic,并支持单片机,元 件库齐全,使用方便,是不可多得的专业的单片机软件仿真系统。 四、硬件设计 电子看板终端上必须有显示器,用于显示数值,我选用led数码管,每一个终端有3组数 码管,每组可显示4个数字,共计12个led数码管。 在单片机的应用系统中,数码管显示器的显示常采用两种方法:静态显示和动态扫描显 示。所谓静态显示,就是把多个led显示器的每一段与一个独立的并行口连接起来,而公 共端则根据数码管的种类连接到"vcc"或"gnd"端,这种连接方式的每一个显示器都要占 用一个单独的具有锁存功能的i/o端口,用于笔划段字形代码,单片机只需把要显示的字 形代码发送到接口电路,就不用再管它了,直到要显示新的数据时,再发送新的字形码 。因此,使用这种方法当显示位数较多时单片机中i/o口的开销很大,需要提供的i/o接 口电路也较复杂,但它具有编程简单、显示稳定,cpu的效率较高的优点。由于静态显示 占用的i/o口线较多,cpu的开销很大,所以为了节省单片机的i/o口线,常采用动态扫描 方式来作为led数码管的接口电路。在实际的工程应用中,它是使用最为广泛的一种显示 方式,其接口电路是把所有显示器的7个笔划段g- a同名端连在一起,而每一个显示器的公共极com端与各自独立的i/o口连接。当cpu向字 段输出口送出字形码时,所有显示器接收到相同的字形码,但究竟是哪个显示器亮,则 取决于com端,而这一端是由i/o口控制的,所以我们就可以自行决定何时显示哪一位了 。 五、软件设计 在软件设计之前,要做两件事,一是看以前学过的单片机书和c语言教程。做单片机实验 ,先学硬件,再学软件,以前做系统时,精力全放在软件上,而做电子看板系统时,既 要考虑软件,还要考虑硬件,系统出问题,软件找不到问题,可能就是"硬件"问题。 六、软件调试 实际上,并不是等到程序完全写好后才调试的,而是写一段,就调试一段,这样可以防 止问题的积累。 参考文献: [1]求是科技.单片机典型外围器件及应用实例[m].北京:人民邮电出版社,2006: 267-309. [2][美]myke predko.精通8051等程序设计[m].田玉敏,译.北京:人民邮电出版 社

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧