汇编源程序——字符串输入输出
- 格式:ppt
- 大小:142.00 KB
- 文档页数:15
字符及字符串输入输出与顺序程序设计实验实验报告2.2.1 实验目的1、学习和掌握字符及字符串的输入输出方法。
2、掌握顺序程序的设计方法。
3、进一步掌握调试工具的使用方法。
2.2.2 实验预习要求1、复习DOS功能调用中用于字符输入(功能号01H)、字符输出(功能号02H)、字符串输入(功能号为0AH)以及字符串输出(功能号09H)的调用方法(详见教材5.5.6)。
2、复习BCD码运算调整指令。
3、根据“2.2.3 实验内容”中给出的源程序框架编写完整的源程序,以便实验时调试。
4、从“2.2.4 实验习题”中任选一道题目,编写源程序,以便上机调试。
2.2.3实验内容从键盘输入两个一位十进制数,计算这两个数之和,并将结果在屏幕上显示出来。
1、问题分析比如使用功能号为01H的用于实现单个字符输入的DOS功能调用接收从键盘输入的两个十进制数8和6,这时计算机内部得到的是这两个数的ASCII码值38H和36H。
由于数字0 9的ASCII码值与其代表的数值之间相差30H,因此将其减去30H即可得到以非压缩型BCD数形式表示的十进制数08H和06H,使用ADD指令对它们进行相加后结果为0EH(00001110B),显然需要用非压缩型BCD数加法调整指令对ADD的运算结果进行调整,调整后得到两个非压缩型BCD数01H和04H,将它们分别加上30H后变为其对应的ASCII码31H(1的ASCII码)和34H(4的ASCII码),然后调用功能号为02H用于单个字符输出的DOS功能调用将它们显示出来。
综上所述,需要考虑以下问题。
(1)从键盘输入一个一位十进制数的方法通过功能号为1的DOS功能调用实现从键盘输入一个字符,格式如下:MOV AH, 01HINT 21H ;此时程序等待用户键入,键入字符的ASCII码值存在AL中SUB AL, 30H ;减去30H后得到键入数字所代表的数值(2)提示信息字符串的显示通过功能号为9的DOS功能调用实现字符串显示,注意字符串的最后一个字符必需为’$’。
汇编语言指令功能总结汇编语言是一种低级语言,主要用于编写机器码指令的程序。
在计算机科学领域中,汇编语言是非常重要的,因为它可以直接操作计算机的硬件资源。
本文将对汇编语言中常用的指令功能进行总结。
1. 数据传输指令数据传输指令用于将数据从一个位置传送到另一个位置。
常用的数据传输指令包括MOV(将数据从一个位置复制到另一个位置)、XCHG(交换两个位置的数据)、PUSH(将数据压入堆栈)、POP (将数据从堆栈中弹出)等。
2. 算术运算指令算术运算指令用于执行各种算术运算,例如加法、减法、乘法和除法。
常用的算术运算指令包括ADD(将两个数相加)、SUB(将一个数减去另一个数)、MUL(将两个数相乘)、DIV(将一个数除以另一个数)等。
3. 逻辑运算指令逻辑运算指令用于执行各种逻辑运算,例如与、或、非和异或。
常用的逻辑运算指令包括AND(对两个数执行与运算)、OR(对两个数执行或运算)、NOT(对一个数执行非运算)、XOR(对两个数执行异或运算)等。
4. 控制转移指令控制转移指令用于实现程序的跳转和循环执行。
常用的控制转移指令包括JMP(无条件跳转到指定的地址)、JZ(如果前一个运算结果为零则跳转)、JC(如果前一个运算结果进位则跳转)等。
5. 位操作指令位操作指令用于对数据的位进行操作。
常用的位操作指令包括AND(将两个数的对应位执行与运算)、OR(将两个数的对应位执行或运算)、NOT(取反操作)等。
6. 字符串操作指令字符串操作指令用于对字符串进行操作。
常用的字符串操作指令包括MOVSB(将一个字节从源地址复制到目的地址)、LODSB(将一个字节从源地址加载到AL寄存器)、STOSB(将AL寄存器中的值存储到目的地址)等。
7. 输入输出指令输入输出指令用于与计算机的输入输出设备进行交互。
常用的输入输出指令包括IN(从指定的端口读取数据)、OUT(将数据发送到指定的端口)等。
总结:汇编语言中的指令功能丰富多样,可以实现各种复杂的操作。
汇编语言---字符串操作指令汇编语言---字符串操作指令字符串操作指令的实质是对一片连续的存储单元进行处理,这片连续的存储单元由隐含指针DS:SI或ES:DI来指定;字符串操作指令可对内存单元按照字节、字、双字进行处理,并能根据操作对象的字节数使变址寄存器SI/DI增加或减少1、2、4字节;规定如下:A.当DF=0时,变址寄存器SI/DI增加1、2、4字节;即:变址寄存器SI/DI递增的步长可以是1、2、4字节;B.当DF=1时,变址寄存器SI/DI减少1、2、4字节;即:变址寄存器SI/DI递减的步长可以是1、2、4字节;一、取字符串数据指令(Load String Instruction)从指针DI:SI所指定的内存单元开始,取一个字节/字/双字,然后存入到AL/AX/EAX中,并根据标志位DF的值对寄存器SI 做相应的增减;把存放字符串数据的连续存储区当做是数据源,使用寄存器SI;该指令的执行不会影响任何标志位;指令格式: LODS 地址表达式LODSB/LODSW 地址表达式LODS 地址表达式;80386+在指令LODS中,它会根据"地址表达式"的属性来决定读取一个字节、字或双字;即:当该地址表达式的属性为字节、字或双字时,将从指针DI:SI处读取一个字节到AL中,或读取一个字到AX中,或读取一个双字到EAX中,与此同时,SI还将分别增减1、2、4字节;取字符串数据指令的功能示意图如下图所示:二、置字符串数据指令(Store String Instruction)该指令把寄存器AL/AX/EAX中的值存入指针ES:DI所指向内存单元开始的一片存储单元中,并根据标志位DF的值对寄存器DI做相应的增减;把存放字符串的连续存储区当做是数据的目的地,使用寄存器DI;该指令的执行并不会影响任何标志位;指令格式: STOS 地址表达式STOSB/STOSW 地址表达式STOSD 地址表达式;80386+置字符串数据指令的功能示意图如下图所示:三、字符串传送指令(Move String Instruction)该指令把指针DS:SI所指向的字节、字或双字传送给指针ES:DI所指向的内存单元,并根据标志位DF的值对寄存器DI 和SI分别作相应的增减;该指令的执行并不会影响任何标志位;指令格式: MOVS 地址表达式1,地址表达式2MOVSB/MOVSW 地址表达式1,地址表达式2MOVSD 地址表达式1,地址表达式2 ;80386+字符串传送指令的功能示意图如下图所示:四、输入字符串指令(Input String Instruction)该指令是从某一指定端口接受一个字符串,并存入到一片连续的存储单元中;输入端口由寄存器DX指定,存储单元的首地址由指针ES:DI 来确定,读入的数据个数由寄存器CX来确定;在指令的执行过程中,还要根据标志位DF的值来对寄存器DI做相应的增减;把存放字符串的连续存储区当做是数据的目的地;该指令不会影响任何标志位;与指令有关的操作数ES、DI、DX和CX等都是隐含操作数; 指令格式: INS 地址表达式INSB/INSW 地址表达式INSD 地址表达式;80386+五、字符串输出指令(Output String Instruction)该指令是把一个给定的字符串输出到一个指定的端口中;输出端口由通用寄存器DX指定,输出数据的首地址由指针DS:SI确定,输出数据的个数由计数寄存器CX来确定;在指令执行的过程中,还要根据方向标志DF的值来对变址寄存器SI 做相应的增减;该指令的执行并不会影响任何标志位;与指令有关的操作数DS、SI、DX和CX等都是隐含操作数; 指令格式: OUTS 地址表达式OUTSB/OUTSW 地址表达式OUTSD 地址表达式;80386+六、字符串比较指令(Compare String Instruction)该指令是把指针DS:SI所指向的字节、字、双字的值与指针ES:DI 所指向的字节、字、双字的值相减,并用所得到的差来设置相关标志位;与此同时,变址寄存器SI和DI也将根据方向标志位DF的值做相应的增减;指令格式: CMPS 地址表达式1,地址表达式2CMPSB/CMPSW 地址表达式1,地址表达式2CMPSD 地址表达式1,地址表达式2 ;80386+受影响的标志位: AF,CF,OF,PF,SF,ZF字符串比较指令的功能示意图如下图所示:七、字符串扫描指令(Scan String Instruction)该指令是用指针ES:DI所指向字节/字/双字的值与相应的AL/AX/EAX的值相减,并依据所得到的差值来设置相关标志位;与此同时,变址寄存器DI还将根据方向标志DF的值来做相应的增减;指令格式: SCAS 地址表达式SCASB/SCASW 地址表达式SCASD 地址表达式;80386+受影响的标志位: AF,CF,OF,PF,SF,ZF字符串扫描指令的功能示意图如下图所示:八、重复字符串操作指令(Repeat String Instruction)前面的字符串操作指令:取字符串数据、置字符串数据、字符串传送、输入字符串、输出字符串、字符串比较、字符串扫描,等指令,都是执行一次所具有的功能;但是,每个字符串通常都是由多个字符组成的,所以,需要重复执行这些字符串操作指令;为了满足这种需要,指令系统提供了一组重复前缀指令;虽然在这些字符串指令的前面都可以添加一个重复前缀指令,但是由于指令执行结果的差异,对某个具体的字符串指令又不用重复前缀指令而改用其它循环来实现重复的需要;重复字符串操作指令对标志位的影响是由被重复的字符串操作指令来决定;1.重复前缀指令REP(Repeat String Instruction) 重复前缀指令是重复其后指定的字符串操作指令,重复的次数由计数寄存器CX来决定;指令格式:REP LODS/LODSB/LODSW/LODSDREP STOS/STOSB/STOSW/STOSDREP MOVS/MOVSB/MOVSW/MOVSDREP INS/INSB/INSW/INSDREP OUTS/OUTSB/OUTSW/OUTSD重复前缀指令的执行步骤如下:STEP1:判断: CX=0STEP2:如果CX=0,则结束重复操作,执行程序中的下一条指令;STEP3:否则,CX=CX-1(不影响相关标志位),并执行重复前缀指令后面指定的字符串操作指令,在该指令执行完后,再转到步骤STEP1;从上面的重复前缀指令格式来看,虽然我们可以使用重复前缀指令来重复取字符串数据指令(第一组指令),但是可能会因为指令的执行结果而在程序中几乎不会使用;例如:编写一段程序,计算字符串"12345abcdefg"中各个字符的ASCII之和;解:......MESS DB '12345abcdefg' ;在数据段进行变量说明......MOV AX,SEG MESSMOV DS,AXLEA SI,MESS ;用DS:SI来指向字符串的首地址;MOV CX,13D ;重复次数XOR BX,BX ;置求和的初值为0REP LODSB ;循环去处字符; ......从程序片段中看,虽然"REP LODSB"能从字符串中逐一取出每个字符,但这个操作是在同一条指令中完成的,程序的其它指令根本无法处理每次取出的字符数据,指令的执行结果是:AL中只保存了最后一次取出的字符'h'的ASCII码;所以,为了实现本例的要求,不能使用重复前缀指令,而要把指令"REP LODSB"改写成如下四条指令:XOR AH,AH ;为后面的累加做准备AGAIN:LODSBADD BX,AX ;AL是被取出的字符,AH已被清0LOOP AGAIN2.条件重复前缀指令(Repeat String Conditionally) 条件重复前缀指令与重复前缀指令的功能相似,所不同的是:条件重复前缀指令中的重复次数不仅由CX来决定,而且还会由标志位ZF的值来决定;根据ZF所起的作用又可分为两种:相等重复前缀指令和不等重复前缀指令;A.相等重复前缀指令:指令格式:REPE/REPZ SCAS/SCASB/SCASW/SCASDREPE/REPZ CMPS/CMPSB/CMPSW/CMPSD该重复前缀指令的执行步骤如下:STEP1:判断条件: CX!=0 且ZF=1STEP2:如果条件不成立,则结束重复操作,执行程序中的下一条指令;STEP3:否则,CX=CX-1(不影响任何标志位),并执行重复前缀指令后面指定的字符串操作指令,在该指令执行后,再转到步骤STEP1;B.不等重复前缀指令:指令格式:REPNE/REPNZ SCAS/SCASB/SCASW/SCASDREPNE/REPNZ CMPS/CMPSB/CMPSW/CMPSD该重复前缀指令的执行步骤如下:STEP1:判断条件:CX!=0 且ZF=0STEP2:如果条件不成立,则结束重复操作,执行程序中的下一条指令;STEP3:否则,CX=CX-1(不影响任何标志位),并执行重复前缀指令后面指定的字符串操作指令,在该指令执行完后,再转到步骤STEP1;。
字体放大即可看清源代码,缩小是为了排版.386.model flat, stdcalloption casemap :noneinclude \masm32\include\kernel32.incinclude \masm32\include\masm32.incinclude \masm32\macros\macros.asmincludelib \masm32\lib\masm32.libincludelib \masm32\lib\kernel32.lib.databuffer db 256 dup(?);message db 'value overflow,please check code',0;message1 db 'The unsigned 32bit value ',0;message2 db ' represented by decimal string is ',0;number_of_32bit dd 12345678h ;You can change the value of unsigned number in here..codeint_to_string proc value:DWORD ;Design a function that exchange unsigned 32bit number to string and outputmov edi,offset buffer; ;Transmit the address of buffer to edi;mov eax,value; ;Transmit unsigned 32bit number to eaxxor ecx,ecx; ;Reset the ecxmov ebx,10; ;Transmit 10 to ebx and ebx used to be divisoragain: xor edx,edx; ;Reset the edxdiv ebx; ;eax/ebx,The quotient is transmited to eax and remainder is transmited to edxjo overflow; ;check overflowpush edx; ;push the edx(remainder) into stackinc ecx; ;ecx=ecx+1test eax,0ffffffffh; ;cmp eax,0je output; ;if eax=0,goto outputjmp again; ;circulateoverflow: print ADDR message; ;Handle overflowinterrupt:jmp interrupt; ;drop-dead halt,express message to user and wait user to handle;output: pop edx; ;pop data to edx;add edx,30h; ;Exchange edx to string(exploit the ASCII)mov [edi],edx; ;Move edx to memory address ediinc edi; ;address+1loop output; ;if ecx>0,circulateprint ADDR message1; ;Print messageprint ADDR buffer;print ADDR message2;print ADDR buffer;jmp interrupt; ;Goto drop-dead halt,express message to user and wait user to handle;ret;int_to_string endp;start: invoke int_to_string,number_of_32bit;invoke ExitProcess,0;end start;Lab1-Report1.My application does’nt support input the unsigned 32-bit numberfrom keybored.But you can change the value by modifysource ,it’s so easy.2.It’s a pity ,my source code only can pass the compile in masm32,Itry compile it in masm5.0 and masm611,But there are many error and warning in masm5.0,while masm611 point out lack connected file.3.In the source code ,I almost write explanatory note for each pieceof code in English.In order to convenient reading for teacher.4.Now,I sketch the code how to work.I put the unsigned 32bitnumber into eax.Put 10 into ebx.buffer store the decimal string.I circularly use eax to divide ebx until The integer part of the value of eax is 0.In every time division ,the quotient stored in eax and the remainder stored in edx,So I also push edx into stack,Butbefore push it into stack ,it will be added 30h so that transmit into string(exploit ASCII).When finished these work.Poping the dataof stack into buffer.Finally output relative information. Attach a screenshot of application running:。
汇编⼊门之输⼊、输出、奇偶判断、多字节变量定义原创⽂章,转载请注明: By Lucio.Yang1.⼊门参考 ⾸先介绍⼀个⾮常好的汇编知识的索引⽹站: 1.1 MOV CX,[BX] 加⽅框的意思是说以BX中的数据为地址寻址,将寻址得到的数据放在CX中 1.2 16位寄存器组 4个数据寄存器(AX、BX、CX和DX) 2个变址和指针寄存器(SI和DI) 2个指针寄存器(SP和BP) 4个段寄存器(ES、CS、SS和DS) 1个指令指针寄存器(IP) 1个标志寄存器(Flags) 1.3 DB 定义字节变量的定义符为DB/BYTE(DefineByte),每个字节只占⼀个字节单元。
1.4 INT 21H 指令说明 参考: 1.5 ⽆符号条件转移指令 JE/JZ ZF=1Jump Equal or Jump ZeroJNE/JNZ ZF=0Jump Not Equal or Jump Not ZeroJA/JNBE CF=0 and ZF=0Jump Above or Jump Not Below or EqualJAE/JNB CF=0Jump Above or Equal or Jump Not BelowJB/JNAE CF=1Jump Below or Jump Not Above or EqualJBE/JNA CF=1 or AF=1Jump Below or Equal or Jump Not Above2.程序内容描述 已知两个整数变量 A 和B,试编写完成下述操作的程序: (1)、若两个数中有⼀个是奇数,则将奇数存⼊A 中,偶数存⼊B 中。
(2)、若两个数均为奇数,则两数分别加1,并存回原变量。
(3)、若两个数均为偶数,则两变量不变。
3.程序流程描述4.源代码DATAS SEGMENTTip db 'Program run successfully',0ah,0dh,'$'Odd db ' is Odd',0ah,0dh,'$'Eve db ' is Even',0ah,0dh,'$'EntX db ' is x ',0ah,0dh,'$'Enty db ' is y ',0ah,0dh,'$'X db 6 dup(?);定义⼀个5个byte型的空间,内容⽤()内的数值填充,是?,不⽤初始化Y db 6 dup(?)DATAS ENDSSTACKS SEGMENT;此处输⼊堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXxor si,si;异或,将变址和指针寄存器清零xor di,di;第⼆个指针寄存器mov cx,5;将5移到cx中,cx控制循环次数INPUTX:mov ah,01h;键盘输⼊⼀个字符int 21h;键盘输⼊并且回显,,将ASCII送⼊AL中cmp al,'0'jb INPUTY;jump if belowcmp al,'9'ja INPUTY;jump if abovemov X[si],al;将输⼊字符移到n[0]inc si;加1指令jmp INPUTXINPUTY:mov ah,01h;键盘输⼊⼀个字符int 21h;键盘输⼊并且回显,将ASCII送⼊AL中cmp al,'0'jb JUDGEX;jump if belowcmp al,'9'ja JUDGEX;jump if abovemov Y[di],al;将输⼊字符移到n[0]inc di;加1指令jmp INPUTYJUDGEX:mov X[si],'$'dec si;减1指令xor ah,ah;ah清空mov al,X[si];si指向低位mov bl,2div bl;除法指令(ax/2),被除数默认存放在AX cmp ah,0;⽆符号⽐较,ZF=1表⽰两个数相等jnz XO;ZF=0,即余数不等于0等于1,为奇数jz XEXO:;输出Xmov dx,offset Xcall OUTPUT;输出奇数字符串mov dx,offset Odd;输出奇数字符串call OUTPUT;判断Y奇偶mov Y[di],'$'dec di;减1指令xor ah,ah;ah清空mov al,Y[di];si指向低位mov bl,2div bl;除法指令(ax/2),被除数默认存放在AX cmp ah,0;⽆符号⽐较,ZF=1表⽰两个数相等jnz OO;ZF=1,即余数不等于0等于1,为奇数jz OEXE:;输出Xmov dx,offset X;取1的偏移地址给dxcall OUTPUT;输出偶数字符串mov dx,offset Evemov ah,09hint 21h;判断Y奇偶mov Y[di],'$'dec di;减1指令xor ah,ah;ah清空mov al,Y[di];di指向低位mov bl,2div bl;除法指令(ax/2),被除数默认存放在AX cmp ah,0;⽆符号⽐较,ZF=1表⽰两个数相等jnz EO;ZF=1,即余数不等于0等于1,为奇数jz EEOO:;输出Ymov dx,offset Ycall OUTPUT;输出奇数字符串mov dx,offset Odd;输出奇数字符串call OUTPUTinc X[si]inc Y[di]jmp EXITOE:;输出Ymov dx,offset Y;取1的偏移地址给dxcall OUTPUT;输出偶数字符串mov dx,offset Evecall OUTPUTjmp EXITEE:;输出Ymov dx,offset Y;取1的偏移地址给dxcall OUTPUT;输出偶数字符串mov dx,offset Evecall OUTPUTjmp EXITEO:;输出Ymov dx,offset Ycall OUTPUT;输出奇数字符串mov dx,offset Odd;输出奇数字符串call OUTPUTmov al,X[0]mov ah,Y[0]xchg ah,X[0]xchg al,Y[0]mov al,X[1]mov ah,Y[1]xchg ah,X[1]xchg al,Y[1]mov al,X[2]mov ah,Y[2]xchg ah,X[2]xchg al,Y[2]mov al,X[3]mov ah,Y[3]xchg ah,X[3]xchg al,Y[3]mov al,X[4]mov ah,Y[4]xchg ah,X[4]xchg al,Y[4]mov al,X[5]mov ah,Y[5]xchg ah,X[5]xchg al,Y[5]jmp EXITEXIT:xor si,sixor di,di;输出最后结果mov dx,offset Xcall OUTPUTmov dx,offset Entxcall OUTPUTmov dx,offset Ycall OUTPUTmov dx,offset Entycall OUTPUTdec cxjmp INPUTX;loop INPUTX mov ah,00h;暂停int 16hMOV AH,4CH;结束,返回DOS INT 21HOUTPUT procmov ah,09hint 21hretOUTPUT endpCODES ENDSEND STARTView Code。
实验一数据传送实验目的:1.熟悉8086指令系统的数据传送指令及8086的寻址方式。
2.利用TurboDebugger调试工具来调试汇编语言程序。
实验任务:1.通过下述程序段的输入和执行来熟悉TurboDebugger的使用,并通过显示器屏幕观察程序的执行情况。
练习程序段如下:MOVBL,08HMOVCL,BLMOVAX,03FFHMOVBX,AXMOVDS:[0020H],BX2.用以下程序段将一组数据压入(PUSH)堆栈区,然后通过不同的出栈顺序出栈,观察出栈后数据的变化情况。
压栈程序段如下:MOVAX,0102HMOVBX,0304HMOVCX,0506HMOVDX,0708HPUSHAXPUSHBXPUSHCXPUSHDX出栈程序段请自行编写(用不同的出栈顺序)。
3.指出下列指令的错误并加以改正,上机验证之。
(1)MOV[BX],[SI](2)MOVAH,BX(3)MOVAX,[SI][DI](4)MOVBYTEPTR[BX],2000H(5)MOVCS,AX(6)MOVDS,2000H4.设置各寄存器及存储单元的内容如下:(BX)=0010H,(SI)=0001H(10010H)=12H,(10011H)=34H,(10012H)=56H,(10013H)=78H(10120H)=0ABH,(10121H)=0CDH,(10122H)=0EFH说明下列各条指令执行完后AX寄存器中的内容,并上机验证。
(1)MOVAX,1200H(2)MOVAX,BX(3)MOVAX,[0120H](4)MOVAX,[BX](5)MOVAX,0110H[BX](6)MOVAX,[BX][SI](7)MOVAX,0110H[BX][SI]5.将DS:1000H字节存储单元中的内容送到DS:2020H单元中存放。
试分别用8086的直接寻址、寄存器间接寻址、变址寻址、寄存器相对寻址传送指令编写程序段,并上机验证结果。
包含14个常见的汇编程序源代码,所有代码在VC6.0中调试通过;汇编程序釆用《微机原理接口与技术》(钱晓婕)一书中所用的框架。
目录1.编写程序,计算下面函数的值并输出。
(2)2.输入一个年份(调用readuid子程序),判断是否是闰年 (2)3.输入三个无符号整数(调用readuid子程序),判断并输出这三个数是否能构成一个三角形的三条边。
若这三个数能构成一个三角形的三条边,输出三角形的形状:斜三角形、等腰三角形、等边三角形。
(3)4.采用无条件和条件转移指令构造while和do while循环结构,完成下面的求和任务并输出sum(sum为双字)。
(5)5.编写程序,求0到100间所有偶数和并输出。
要求采用loop、while# do while三种不同的循环结构完成。
(6)6.Fibonacci numbers 的定义: (8)fl=l,f2=l z fn= fn-1 + fn-2 n>=3 (8)编程输出Fibonacci numbers的前30 项。
(8)7.有一个首地址为array的20个有符号的双字数组,编程分别求出正数的和与负数的和并输出。
(10)8.有一个首地址为string的字符串,剔除string中所有的空格字符。
请从字符串最后一个字符开始逐个向前判断、并进行处理。
(12)9.有一个首地址为string的字符串,分别统计string中空格、英文字母、数字和其它字符的个数并输出。
(13)10.palindrome(回文)是指正读和反读都一样的数或文本。
例如:11、121. 12321 等,编写程序,求10到10000之间所有回文数并输出。
要求每行输出10个数。
1511.编写程序,求出所有满足勾股定理且边长不大于500的直角三角形。
.1712.编写一个求n!的子程序,利用它求1 !+2!+引+4!+5!+6!+7!+8!的和并输出。
2213.编写一个判断闰年的子程序,利用它求出2010年到2060年之间所有的闰年并输出。
《汇编语言程序设计》考试练习题及答案一、单选题1. 计算机中存取信息或数据的最小单位为()A 、位B 、字节C 、字D 、双字答案:B2. 调用子程序的指令为()A 、CALLB 、RETC 、HLTD 、NOP答案:A3. DOS功能调用是通过()指令去调用DOS系统提供的软件中断处理程序A 、INT 21HB 、INT 23HC 、INT 12HD 、INT 11H答案:A4. 满足()时,CPU允许中断A 、IF=0B 、IF=1C 、DF=0D 、DF=1答案:B5. 完成对CL寄存器的内容乘以4的正确操作是()。
A 、ROL CL,1 ROL CL, 1B 、MUL 4C 、SHL CL, 1 SHL CL, 1D 、MOV CL , 2 SHL CL, CL答案:C6. 下面寄存器中可以分为两个独立8位寄存器的是()A 、AXB 、DIC 、CSD 、SI答案:A7. ()是用二进制编码的机器指令的集合及一组使用机器指令的规则,是CPU能直接识别的唯一语言。
A 、汇编语言B 、机器语言C 、JAVA语言D 、C语言答案:B8. 源程序模块结束语句为()A 、ORGB 、ENDC 、SEGMENTD 、START答案:B9. 8位补码表示的有符号数的表示范围是()A 、0~255B 、-128~+127C 、0~65535D 、-32768~+32767答案:B10. 在一段汇编程序中多次调用另一段程序,用宏指令比用子程序实现起来,下列说法正确的是()A 、占内存空间小,但速度慢B 、占内存空间大,但速度快C 、占内存空间相同,但速度快D 、占内存空间相同,但速度慢答案:B11. 与LEABX ,BUF指令完全等效的指令是()。
A 、MOV BX ,BUFB 、LDS BX ,BUFC 、MOV BX ,OFFSET BUFD 、MOV BX ,WORD PTR BUF答案:C12. 14的非压缩BCD码为()A 、00010100B 、01000001C 、0000000000010100D 、0000000100000100答案:D13. 要实现使BETA的值为56,应采用的语句是()A 、BETA DB 56B 、BETA DB 56HC 、BETA EQU 56HD 、BETA EQU 56答案:D14. ()不可以做目的操作数A 、立即数B 、寄存器C 、存储器操作数D 、累加器答案:A15. 计算机一般由中央处理器、存储器和输入/输出子系统组成,其中()可以存放程序、数据、信息及中间结果。
汇编语言常用语句一览在学习和使用汇编语言时,熟悉常用的语句和指令是非常重要的。
本文将列举出一些汇编语言中常用的语句,以供参考和学习。
1. 数据传输指令MOV:将源数据移动到目标操作数中PUSH:将数据压入栈中POP:将栈顶元素弹出2. 算术运算指令ADD:将源数据与目标操作数相加SUB:将源数据与目标操作数相减INC:目标操作数自增1DEC:目标操作数自减1MUL:将源数据与目标操作数相乘DIV:将源数据与目标操作数相除3. 条件跳转指令JMP:无条件跳转到指定地址JZ/JNZ:根据零标志位是否为零跳转JE/JNE:根据相等标志位是否为真跳转JL/JLE:根据小于/小于等于标志位是否为真跳转JG/JGE:根据大于/大于等于标志位是否为真跳转4. 循环指令LOOP:循环指令,根据计数寄存器的值判断是否继续循环 INC/DEC + CMP + JNZ:结合使用,实现循环功能5. 标志位设置指令CMP:比较操作数,设置相应标志位TEST:与目标操作数进行按位与操作,设置相应标志位6. 子程序调用指令CALL:调用子程序RET:子程序返回指令7. 输入输出指令IN:从设备或端口读取数据OUT:向设备或端口输出数据8. 定义数据段指令DB:定义字节数据DW:定义字数据DD:定义双字数据9. 定义代码段指令SECTION:定义代码段10. 定义变量和常量指令DW:定义字变量或常量DD:定义双字变量或常量11. 定义字符串指令DB "Hello, World!",0:定义以0结尾的字符串12. 定义宏指令MACRO:定义宏ENDM:结束宏定义13. 定义过程指令PROC:定义过程ENDP:结束过程定义14. 调试指令INT 3:设置断点NOP:空操作以上是汇编语言中常用的语句一览。
通过熟悉和掌握这些语句,可以更好地编写汇编语言程序,并实现所需的功能。
希望本文对你的学习和使用汇编语言有所帮助。