随笔分类 -  汇编基础

1

手把手教你在64位Win7下部署16位汇编学习环境
摘要:实现方式是VirtualBox虚拟机+精简的32位xp系统。指导小白用,高手就直接跳过吧。一、背景 初学者学习汇编语言通常是从16位汇编开始,但是现在的64位Win7系统明确表示不支持16位的程序。尽管masm具有64位版本,但是它编译出的程序已经失去了16位程序简洁直接的特性,也失去了作为汇编初学语言的优势。所以要想保留Win7又想学习汇编就需要搭建一个16位汇编的运行环境,目前有这样几种方式直接在硬盘上安装双系统,但是在高版本系统基础上再安装低版本系统,启动菜单是个麻烦事。 制作优盘版PE。这种方式用起来就比较麻烦,要插上优盘重启电脑。并且不是所有电脑都支持优盘启动。(小米还怕它不安全。。 阅读全文

posted @ 2011-05-18 11:24 石莹 阅读(22781) 评论(7) 推荐(0) 编辑

c语言强化训练笔记2010/5/9
摘要:函数指针下面是关于函数指针的一些资料函数指针是指向函数的指针变量。因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是一致的。函数指针有两个用途:调用函数和做函数的参数。函数指针的声明方法为:数据类型标志符 (指针变量名) (形参列表);我们通过(*(int far *)+地址)这样的代码实现了访问任意一段内存的数据,那么可以通过 阅读全文

posted @ 2010-05-13 10:54 石莹 阅读(538) 评论(0) 推荐(0) 编辑

c语言强化训练笔记2010/5/8
摘要:不使用变量的编程 变量的本质是内存空间的别名,通过对汇编的学习和王爽汇编语言第二版的综合研究,我们可以在c程序中直接使用内存空间来编程 例如,我们想通过编程在屏幕中央显示8个绿色的a,可以通过写显存的方式在b800段内存写入显示的数据,同时,我们还需要有一个计数器来控制循环了多少次,可以把一段安全的空间来当计数器使用,程序可以这样编写main(){ for ((*((int far *)0x00000200))=0; (*((int far *)0x00000200))<8; (*((int far *)0x00000200))++) { (*(int far *)(0xb8000000 阅读全文

posted @ 2010-05-12 18:36 石莹 阅读(469) 评论(0) 推荐(0) 编辑

王爽汇编语言综合研究-函数如何接收不定数量的参数
摘要:1、c语言如何传递参数 编写这样一个程序试验 void showchar(char a,int b);main(){ showchar('a',2);}void showchar(char a,int b){ *(char far *)(0xb8000000 + 160*10 + 80) = a; *(char far *)(0xb8000000 + 160*10 + 81) = b;} 调试这个... 阅读全文

posted @ 2010-04-18 08:59 石莹 阅读(1555) 评论(0) 推荐(1) 编辑

王爽汇编语言综合研究-不用main函数编程
摘要:这一部分继续深入研究用汇编解释c的原理,尝试不用main()函数编写可以正确运行的程序 1、首先编写一个简单的程序 f(){ *(char far *)(0xb8000000+160*10+80) = 'a'; *(char far *)(0xb8000000+160*10+81) = 2;} 在TC中编译,连接这个程序。出现了一个连接错误 Linker Error:Undefined symbo... 阅读全文

posted @ 2010-04-17 16:25 石莹 阅读(3197) 评论(0) 推荐(0) 编辑

王爽汇编语言综合研究-使用内存空间
摘要:1、在c程序中直接访问内存空间 写入以下程序并调试 main() { *(char *)0x2000 = 'a'; *(int *)0x2000 = 0xf; *(char far *)0x20001000 = 'a'; _AX = 0x2000; *(char *)_AX = 'b'; _BX = 0x1000; *(char *)(_BX + _BX) = 'a'; *(char far *)... 阅读全文

posted @ 2010-04-14 01:27 石莹 阅读(1642) 评论(1) 推荐(2) 编辑

汇编语言综合研究——使用寄存器
摘要:王爽汇编语言综合研究 使用寄存器 1、使用寄存器编程 main函数是c语言编写程序的入口函数,但是main中的第一条语句并不是程序中被执行的第一条指令,还有很多其它语句。为了研究我们的程序编译后的语句,首先要找main函数的位置,可以通过下边的程序获得main函数的偏移地址 Main() { Printf(“%x\n”,main); } 函数中printf语句表示以16进制打印main... 阅读全文

posted @ 2010-04-13 16:56 石莹 阅读(559) 评论(0) 推荐(0) 编辑

王爽汇编语言课程设计2
摘要:王爽汇编语言 第二版 课程设计2编写一个可以自行启动的计算机,不需要在现有操作系统环境中运行的程序一、相关资料 系统启动初始化完成后最终调用19h,该中断读取软盘的第一扇区或硬盘的第一扇区到0:7c00开始的512个字节的内存空间中,并将cs:ip指向0:7c00执行。更详细参考王爽汇编语言第二版,课程设计2,p.312二、设计思路 将安装程序分为三个段,1、第一个段为安装程序,负责将第二个段写入第一扇区,第三个段写入2-17扇区;2、第二个段是主引导程序,存在于软盘第一扇区,由BIOS的19h中断读取到0:7c00开始的内存单元中,并执行0:7c00的第一行代码。这一段的任务是将软盘2-17 阅读全文

posted @ 2010-04-06 18:42 石莹 阅读(5678) 评论(0) 推荐(0) 编辑

用逻辑扇区号读写软盘的中断例程测试程序
摘要:王爽汇编语言 实验17 中断例程测试程序一、实验要求 测试实验17中断例程二、测试思路1、编写程序A,实现将显存中第一屏4000个字节(8个扇区)写入软盘2、编写程序B,实现将软盘中8个扇区的数据读出到显存第一屏中3、运行实验17的中断安装程序,然后运行程序A,清屏后运行程序B。正常状况下屏幕内容恢复三、详细设计1、程序Aassume cs:codecode segmentstart:mov ax,0b800hmov es,axmov si,0mov ah,1mov dx,0mov al,8mov bl,0int 7chmov ax,4c00hint 21hcode endsend start 阅读全文

posted @ 2010-03-30 16:12 石莹 阅读(353) 评论(0) 推荐(0) 编辑

编写用逻辑扇区号读写软盘的中断例程
摘要:王爽汇编语言 实验十七一、相关资料1、软盘 以3.5英寸软盘为例,软盘分为上下两面,每面80个磁道,每个磁道18个扇区,每个扇区512B则软盘的大小为:2面*80磁道*18扇区*512B=1440KB(约为1.44MB)2、BIOS对访问磁盘的支持 BIOS提供了13h号中断来访问磁盘,该中断的参数如下:(ah)=int 13h的功能号(2表示读扇区,3表示写扇区)(bl)=读取的扇区数(ch)=磁道号(cl)=扇区号(dh)=磁头号(相当于软盘的面号)(dl)=驱动器号(软驱从0开始,0:软盘A,1:软盘B;硬盘从80h开始,80h:硬盘c,81h:硬盘d)es:bx 指向数据存放的缓冲区返 阅读全文

posted @ 2010-03-30 11:48 石莹 阅读(758) 评论(0) 推荐(0) 编辑

多个功能子程序的中断例程测试程序
摘要:王爽汇编语言 实验16 编写包含多个功能子程序的中断例程 测试程序一、实验要求1、完全测试实验16中断例程17ch的所有功能,包含清屏、改变前景色、改变背景色、向上滚动一行2、用一个菜单来提示用户输入3、通过判断用户输入的命令来调用响应的子过程二、分析1、输出菜单 定义一个数据段,存放菜单内容的几个以‘$'为结尾的字符串,然后定义一个直接定址表,存放菜单各字符串的首地址,通过调用10号中断的2号功能改变光标地址,调用21号中断的9号功能输出字符串,通过循环输出全部菜单2、获取用户输入 定义一个表来存放测试的各个子过程的首地址,调用16号中断的0号功能来获取键盘缓冲区的数据,该数据减去3 阅读全文

posted @ 2010-03-28 08:39 石莹 阅读(433) 评论(0) 推荐(0) 编辑

编写包含多个功能子程序的中断例程
摘要:王爽汇编语言 实验16 编写包含多个功能子程序的中断例程一、实验要求安装一个新的int 7ch中断例程,为显示输出提供如下功能子程序(1)清屏;(2)设置前景色(3)设置背景色(4)向上滚动一行入口参数说明:(1)用ah寄存器传递功能号,0表示清屏,1表示设置前景色,2表示设置背景色,3表示向上滚动一行(2)对于2,3功能,用al传递颜色值,(al)取值{0,1,2,3,4,5,6,7}二、程序代码assume cs:codecode segmentsetscreen:jmp short settable dw sub1,sub2,sub3,sub4;通过该表查找子程序的始地址set:push 阅读全文

posted @ 2010-03-25 17:34 石莹 阅读(785) 评论(0) 推荐(0) 编辑

编写0号中断的处理程序
摘要:一、实验要求 编写0号中断的处理程序,使得在除法溢出发生时,在屏幕中间显示字符串“overflow”,然后返回到DOS。 二、设计思路: 1、编写0号中断的处理程序,该程序显示字符串,然后返回到DOS 2、编写安装程序,将步骤1中处理程序复制到0000:0200开始的内存中 3、修改中断向量表,使0号中断的处理程序地址指向0000:0200 三、详细设计 assume cs:codesg cod... 阅读全文

posted @ 2010-03-11 16:29 石莹 阅读(2096) 评论(0) 推荐(0) 编辑

王爽汇编语言课程设计1
摘要:一、实验要求 在屏幕输出实验七中的数据 二、设计思路 1、将实验七的程序编写成一个子过程finishing,在主程序中调用,可以获得实验七种指定格式的table段数据,设置es:bx指向table段中第一行 2、创建一个数据缓存区buffer,设置ds:si指向buffer 3、对于字符串,从table中读取后写入buffer,末尾写入0;对于数值,直接调用实验10中写好的dtoc转换到buffe... 阅读全文

posted @ 2009-12-29 18:35 石莹 阅读(5301) 评论(1) 推荐(1) 编辑

将数值转换为表示十进制数的字符串2
摘要:王爽汇编语言第二版 一、实验要求 上一部分实现了把一个word类型的数据转换为表示十进制数的字符串,现有需求要实现dword类型数据的转换,可用类似算法实现。算法参考http://www.cnblogs.com/S-E-P/archive/2009/12/28/2045087.html。 对dword类型的转换可能出现除法溢出的问题,解决方法参考http://www.cnblogs.com/S... 阅读全文

posted @ 2009-12-28 15:51 石莹 阅读(437) 评论(0) 推荐(0) 编辑

将数值转换为表示十进制数的字符串
摘要:王爽汇编语言第二版,实验10.3一、实验要求编写一个子程序,实现将一个数值转换为表示十进制数的字符串二、程序接口名称:dtoc功能:将word型数据转变为十进制数的字符串,字符串以0为结尾符参数:(ax) = word型数据ds:si指向字符串的首地址返回:无三、算法概述1、可以反复调用除法运算除以10d取余数,直到商为0,可以获得十进制各位码 例如:10 | 12666 6 ——————10 | 12666 —————10 | 126 6 ———— 10 | 12 2 ——— 10 | 1 1 —— 02、对十进制各位码加上30h就转换成为了各位的ASCII值四、实现代码dtoc: push 阅读全文

posted @ 2009-12-28 14:00 石莹 阅读(2284) 评论(0) 推荐(0) 编辑

解决除法溢出问题
摘要:王爽汇编语言第二版实验10.2 一、实验要求 当用div指令进行8位除法运算时结果大于8位,或进行16位除法运算结果大于16位时,会出现除法溢出的错误。要求编写一个子程序,实现支持结果不会出现溢出的除法运算 二、算法概述 通过一个公式将可能产生溢出的运算X/N,转变为多个不会产生溢出的除法运算。公式中,等号右边的所有除法运算都可以用div指令来实现,并且不会产生除法溢出 公式:X/N = in... 阅读全文

posted @ 2009-12-27 19:34 石莹 阅读(2137) 评论(0) 推荐(0) 编辑

显示字符串的子程序
摘要:王爽汇编语言第二版,实验10.1 一、实验要求 编写一个显示用0结束字符串的子程序,要求向外提供与显存结构无关的接口 二、子程序接口 名称:show_str 功能:在指定位置,用指定的颜色,显示一个用0结束的字符串 参数:(dh)=行号(取值范围0-24), (dl)=列号(取值范围0-79), (cl)=颜色, ds:si指向字符串的首地址 返回值:无 三、实现代码 show_str: ... 阅读全文

posted @ 2009-12-27 12:16 石莹 阅读(462) 评论(0) 推荐(0) 编辑

矩阵的转置2
摘要:王爽汇编语言第二版学习笔记 一、题目要求 在一个段中定义一个16*16(256个字节)的矩阵,并从00-FF填充数据。编程程序,实现该矩阵的转置,不允许使用其它的任何内存空间(包括栈) 二、实现代码 assume cs:codesg,ds:datasg datasg segment db 256 dup (0) datasg ends codesg segment start: mov ax,... 阅读全文

posted @ 2009-12-25 21:26 石莹 阅读(383) 评论(0) 推荐(0) 编辑

矩阵的转置1
摘要:王爽汇编第二版学习笔记 一、题目要求: 1、在一个段中定义两个16*16(256个字节)的内存空间矩阵,对第一个矩阵中用循环填充00-FF。 2、要求在第二个矩阵中实现对第一个矩阵的转置 二、实现代码 assume cs:codesg,ds:datasg datasg segment db 256 dup (0) db 256 dup (0) datasg ends codesg segmen... 阅读全文

posted @ 2009-12-25 17:35 石莹 阅读(496) 评论(0) 推荐(0) 编辑

1
点击右上角即可分享
微信分享提示