08 2013 档案

摘要:assume cs:codedata segment db "Beginner's All-purpose Symbolic Instruction Code.",0data endscode segmentbegin: mov ax,data mov ds,ax mov si,0 call letterc mov ax,4c00h int 21h;名称:letterc;功能:将以0结尾的字符串中的小写字母转变为大写字母;参数:ds:si指向字符串首地址letterc: push cx pushf mov cx,0s1: mov... 阅读全文
posted @ 2013-08-30 16:03 tsembrace 阅读(1942) 评论(0) 推荐(1) 编辑
摘要:汇编语言---关于自定义的段占用内存空间在王爽汇编实验5(2)中有这样一个问题:对于如下定义的段:name segment ...name ends如果段中的数据占N个字节,则程序加载后,其实际占用空间当时在做这道题时候,只是通过debug加载多个类似程序,然后观察,得出实际占用空间为16;([N/16]+1)字节。即对于设定的段空间,如果在预设时候的数据不足16字节;则给其分配空间为m{m=([N/16]+1)},编译器会自动给其增补内存空间。当时只是以为这就是规则,而没有深入去考虑为什么制定这样的规则?对于程序而言,数据段的设置是为了方便使用,而使用数据段则需要知道其段地址。举例如下:a 阅读全文
posted @ 2013-08-30 14:14 tsembrace 阅读(2998) 评论(0) 推荐(0) 编辑
摘要:第十一章 标志寄存器一、各标志位说明1、ZF标志*名称:零标志位*位置:第6位*作用:记录相关指令执行后,结果是否为0.如果结果为0,则zf位为1;反之为0.2、PF标志*名称:奇偶标志位*位置:第2位*作用:记录相关指令执行后,结果所有bit位中为1的个数是否为偶数.如果为偶数,则pf位为1;反之为0.3、SF标志*名称:符号标志位*位置:第7位*作用:记录相关指令执行后,结果是否为负.若为负,则sf位为1;反之为0。4、CF标志*名称:进位标志位*位置:第0位*作用:记录相关指令执行后,结果是否向更高位借位(进位)。若有借位(进位),则cf位为1;反之为0.*备注:只相关于无符号数的运算。 阅读全文
posted @ 2013-08-30 14:10 tsembrace 阅读(866) 评论(0) 推荐(0) 编辑
摘要:;程序目标为在屏幕指定位置显示数据;数据分为四项:年份、收入、员工数、人均收入;其中人均收入要通过计算得出;上述数据又分为两大类:字符类:如年份;数字类:(收入、员工数、人均收入);字符类不需要转换可直接存入显示缓冲区;数字类需要先转换为对应字符,再存入显示缓冲区;程序设计思路如下:;第一步:求出人均收入存入data指定区域(设计子函数1:避免溢出的dword/word型运算);第二步:在指定区域显示年份数据(设计子函数2:显示指定内存区的数据到屏幕指定位置);第三步:将指定区域dword型数字数据转换成字符串并显示(设计子函数3:转换dword型数据为字符串,存入指定显示缓冲区);第四步:将 阅读全文
posted @ 2013-08-28 16:34 tsembrace 阅读(2278) 评论(1) 推荐(1) 编辑
摘要:第十章 CALL和RET指令一、ret和retf*ret:功能为:pop ip,实现的是段内近转移;相当于jmp near ptr X*retf功能为:pop ip,pop cs,实现的是远转移;相当于jmp far ptr X二、call指令*call指令分为两步:(1)将当前IP压入栈;(2)设置新IP进行转移。1、依据位移进行转移的call指令call 标号,功能为:push IPjmp near ptr 标号可看出call的转移操作与jmp near ptr一样,均使用位移进行,位移量为16位。2、直接使用转移目的地址的call指令(1)转移目的地址在指令中的call指令:call f 阅读全文
posted @ 2013-08-26 16:33 tsembrace 阅读(1237) 评论(0) 推荐(0) 编辑
摘要:一、编程目标:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串'welcome to masm!'。二、程序分析在屏幕中显示字符即是向显示缓冲区的对应区域写入字符。1、定位屏幕输出位置字符串长度为16,屏幕每行总共为80个字符的输出宽度。要使得居中,则字符左右要各空32个字符位置。即字符串首字符位于每行的第33个字符位,字符串占第33列到第48列。屏幕每页为25行,输出目标为3行,即三个字符串占第12、13、15行。即第一个字符串在显示缓冲区内起始位置为:(B8000H+11*80*2+32*2);第二行的起始地址为在第一行基础上加上80*2;第三行类推。2、字符信息的设置字 阅读全文
posted @ 2013-08-25 18:55 tsembrace 阅读(1721) 评论(0) 推荐(1) 编辑
摘要:第9章 转移指令的原理一、8086转移指令的分类1、无条件转移指令,如jmp;2、条件转移指令,如jcxz;3、循环指令,如loop;4、过程;5、中断二、几种转移指令的详解*基础知识:补码在计算机系统中,数值一律用补码来表示(存储)。正数补码与原码相同,如十进制17;原码为0001 0001;其补码也为0001 0001;负数的补码最高位取1,剩余7位为将负数取绝对值按位取反后+1,得其补码(对8位补码)。如-1;最高位取1,绝对值7位为0000001,按位取反后为1111110;+1后为1111111;则-1的补码为11111111.也可知,对8位补码,其可表示的数值范围为-128~127 阅读全文
posted @ 2013-08-25 16:53 tsembrace 阅读(2545) 评论(2) 推荐(0) 编辑
摘要:第八章 数据处理的两个基本问题一、寄存器*reg:表示寄存器。8086寄存器包括ax,bx,cx,dx,al,ah,bl,bh,cl,ch,dl,dh,ss,cs,es,ds,sp,bp,si,di;其中sreg表示段寄存器,包括ds,es,ss,cs.*只有bx,bp,si,di这四个寄存器可用来作为偏移地址寻址。且bx和bp不能同时使用,si和di不能同时使用,具体应用方式如下: [bx],[bp],[si],[di];[bx+si],[bx+di],[bp+si],[bp+di];[bx+si+idata],[bp+di+idata]..etc.*对于使用bx寻址的应用,段地址默认存在d 阅读全文
posted @ 2013-08-25 15:14 tsembrace 阅读(1573) 评论(0) 推荐(1) 编辑
摘要:其实还真没找到一处满意的地方。CSDN会和博客园同步更新~老梧桐20130821 阅读全文
posted @ 2013-08-21 22:26 tsembrace 阅读(187) 评论(0) 推荐(0) 编辑
摘要:八十七、回答结果(结构体变量传递)输出依然为3,a。函数f传递的是变量a的一个副本复制。#include "stdio.h"struct student{ int x;char c;} a;main(){a.x=3;a.c='a';f(a);printf("%d,%c",a.x,a.c);}f(struct student b){b.x=20;b.c='y';}八十九、某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交 阅读全文
posted @ 2013-08-21 17:02 tsembrace 阅读(945) 评论(0) 推荐(0) 编辑
摘要:六十八、有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。#includevoid move_array(int a[],int n,int m){ int i; int b[100]; if(m>n) { printf("input error(%d must less than %d).\n",m,n); } else { for(i=0;i#define mynumber 17int pick_num(int a[],int n){ int i=0; //数组下标 ... 阅读全文
posted @ 2013-08-19 19:29 tsembrace 阅读(879) 评论(0) 推荐(0) 编辑
摘要:第七章 更灵活的定位内存地址的方法7.1 and和or指令(1)and/or指令:按位的运算符。不能对内存单元直接操作,须借助寄存器中转。(2)and/or指令的应用:因为不管1还是0,和1进行与运算,都能维持原数不变;与1进行或运算,都能使原数置1.和0进行与运算,都能置0;和0进行或运算,都能维持原数不变。可利用上述特点,进行一些应用,比如转换大小写字母。一个字母的大写ASCII码都比小写ASCII码值小20H。比如A是41H,a是61H。对应二进制码分别为0100 0001H,0110 0001H.如果要将A转成a,直接用A+20H就可以。但如果有一个字母,事先不知道其是大写还是小写,但 阅读全文
posted @ 2013-08-18 16:44 tsembrace 阅读(4970) 评论(3) 推荐(1) 编辑
摘要:在学习王爽汇编第六章的时候,接触到在源程序中不同段的设置,如数据段、栈段、代码段的分别设置。如下格式:assume cs:code,ds:data,ss:stackdata segment ...data endsstack segment ...stack endscode segmentstart: ...code endsend start那么对于data段定义的数据来说,定义后CPU给这段数据的空间大小是如何确定的呢?通过第六章的实验题目,可以知道:数据段空间大小为定义数据所需的16字节的最小整数倍。比如定义了1个字节,系统就给数据段分配16个字节;定义了17个字节,系... 阅读全文
posted @ 2013-08-18 11:50 tsembrace 阅读(14129) 评论(0) 推荐(2) 编辑
摘要:检测点6.1(1)依次用内存0:0~15单元中的内容改写程序中的数据,补全程序:assume cs:codesgcode segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hstart: mov ax,0 mov ds,ax mov bx,0 mov cx,8s: mov ax,[bx] mov cs:[bx],ax ;确定目标区域段地址和偏移地址 add bx,2 loop s mov ax,4c00h int 21hcodesg endsend star... 阅读全文
posted @ 2013-08-17 16:03 tsembrace 阅读(24458) 评论(6) 推荐(2) 编辑
摘要:二十二、两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。#includeint main(){ char i,j,k; //设a\b\c对手 for(i='X';i%c\nb------->%c\nc------->%c\n",i,j,k); } getch(); return 0;}二十四、有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。程序分析:第一... 阅读全文
posted @ 2013-08-17 13:44 tsembrace 阅读(1049) 评论(0) 推荐(0) 编辑
摘要:回顾总结:前面花了两大篇幅分别说一维和二维数组,始终在围绕着“地址”说数组。再回头想一下:数组在C语言里是一种构造类型,那么C语言是如何构造它的?C语言先在数组定义时候将其元素依序存储在一段内存中,如果没有“构造”的过程,也就没有数组的概念了,因为如果要访问这段连续的内存,只需要知道这段内存的基址、元素的数据类型以及长度,就可以访问、操作任一个元素了,比如:访问第i个元素就可以用*(Base_address+i*sizeof(element type))进行,这是一种直接的地址偏移的访问方式。而通过构造数组,使得我们可以很方便的通过下标方式array_name[i]访问。C语言构造数组的主要工 阅读全文
posted @ 2013-08-14 11:21 tsembrace 阅读(918) 评论(0) 推荐(0) 编辑
摘要:二、二维数组对于一个n维数组,其实质上还是一个一维数组,这个一维数组的每个元素又都是一个(n-1)维数组。。以此类推。复杂的不去深究,就看二维数组a[m][n],实质是一个由m个元素组成的一维数组,每个元素又都是含n个元素的一维数组,这个二维数组共计m*n个元素。对于一个二维数组,它实质上是一个一维数组,但是是什么样的一维数组?这个一维数组的元素是什么?对于int a[2][3],逻辑上是2行×3列的整型矩阵,在内存分布中为线性存储。其定义为:int a[2][3]={{1,2,3},{4,5,6}};容易看出这是含有两个元素的一维数组,每个元素又都是一个含有3个整型数据的一维数组。 阅读全文
posted @ 2013-08-13 21:43 tsembrace 阅读(496) 评论(0) 推荐(0) 编辑
摘要:一、一维数组1、在内存空间上的存放一个数组在定义后其在内存中各元素的存放是占据一段连续的地址空间,每个元素需要的空间取决于数组类型:整型需要4字节,字符型需要1字节。示例:对于int a[100],在内存中占用100×4=400字节空间;对于char c[100]占据内存空间为100字节。2、数组名2.1数组名是什么?首先数组名是数组的名字,所以数组名表示该数组=。=这绝不是废话,这句话非常有助于后面的理解。其次,数组名还能表示什么?我们都知道,数组名能表示一个地址,如何描述该地址,先直接给出答案:数组名还表示该数组首元素的地址=。=(依然不是废话,而是要注意到:是该数组首元素地址, 阅读全文
posted @ 2013-08-13 21:31 tsembrace 阅读(6475) 评论(0) 推荐(0) 编辑
摘要:(1)编程,向内存0:200~0:23f依次传送数据0~63.assume cs:codecode segment mov ax,20H mov ds,ax mov bx,0 mov cx,64s: mov [bx],bl inc bx loop s mov ax,4c00H int 21Hcode endsend(3)程序功能是将"mov ax,4c00h"之前的指令复制到内存0:200处,补全程序:;只写关键代码;每次复制单字节数据,并通过al中转;程序入口为cs:0(ip=0),所以第一空处传递段地址为cs;接下来需要确定循环次数,即... 阅读全文
posted @ 2013-08-11 18:56 tsembrace 阅读(18592) 评论(1) 推荐(0) 编辑
摘要:第五章 [BX]和loop指令*Loop指令格式:loop 标号等同步骤:(1)(cx)=(cx)-1;(2)若(cx)!=0,跳转到标号位置继续执行。*Debug的相关命令及说明g命令:g 偏移地址;使得执行到cs:偏移地址处停止;p命令:使Debug程序自动重复执行代码中的循环指令,直到(cx)=0为止。用Debug中直接写入指令,[idata]可以表示((段地址)*16+idata)处的值;而如果在汇编源代码中[idata]会被编译器masm处理为idata这个数值。所以在汇编源代码中当使用立即数来表示偏移地址时,须加前缀以显式表明,比如:ds:[idata]。*示例:计算ffff:0~ 阅读全文
posted @ 2013-08-11 18:36 tsembrace 阅读(789) 评论(0) 推荐(0) 编辑
摘要:十七、输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。#includeint main(){ char mychar; int c_num,sp_num,num_num,oc_num,all_num; c_num=sp_num=num_num=oc_num=all_num=0; printf("请输入一串字符,以换行符结尾\n"); mychar=getchar(); while(mychar!='\n') { if(mychar>='0'&&mychar='A')&&( 阅读全文
posted @ 2013-08-11 14:04 tsembrace 阅读(562) 评论(0) 推荐(0) 编辑
摘要:八、输出9*9口诀。#includeint main(){ int r[9]={1,2,3,4,5,6,7,8,9}; int c[9]={1,2,3,4,5,6,7,8,9}; int i,j; printf("0\t1\t2\t3\t4\t5\t6\t7\t8\t9\n"); for(i=1;iint F_rabbit(unsigned int x){ if(x==0) return 0; if(x==1||x==2) return 2; else return F_rabbit(x-1)+F_rabbit(x-2);}int main(){... 阅读全文
posted @ 2013-08-08 14:19 tsembrace 阅读(702) 评论(0) 推荐(0) 编辑
摘要:一、有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?#includeint main(){ int i,j,k; int number=0; for(i=1;iint main(){ long profit,bonus; printf("请输入利润额:\n"); scanf("%ld",&profit); if(profitint main(){ long i,j; int x; for(i=13;iint Judge_leapyear(int year){ if(year%400==0) ... 阅读全文
posted @ 2013-08-06 22:02 tsembrace 阅读(807) 评论(0) 推荐(0) 编辑

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