西南民大汇编考试

1 什么是标志?它有什么用途?状态标志和控制标志有什么区别?画出标志寄存器FLAGS,说明各个标志的位置和意义。

〔解答〕

标志用于反映指令执行结果或控制指令执行形式。它是汇编语言程序设计中必须特别注意的一个方面,状态用来记录运行的结果的状态信息,许多指令的执行都将相应地设置它,控制标志位可由程序根据需要用指令设置,用来控制处理器执行指令的方式

15   14    13  12   11   10    9    8    7    6    5    4    3    2    1    0

 

 

 

 

OF

DF

IF

TF

SF

ZF

 

AF

 

SF

 

CF

CF是进位标志;ZF 是零标志;SF是符号标志;PF奇偶标志;OF溢出标志;AF辅助进位标志;DF方向标志;IF中断允许标志;TF陷阱标志。

 

2 举例说明CFOF标志的差异。

〔解答〕

溢出标志OF和进位标志CF是两个意义不同的标志。

进位标志表示无符号数运算结果是否超出范围,运算结果仍然正确;溢出标志表示有符号数运算结果是否超出范围,运算结果已经不正确。

例1:3AH + 7CH=B6H

无符号数运算:58+124=182,范围内,无进位

有符号数运算: 58+124=182 ,范围外,有溢出

例2:AAH + 7CH=(1)26H

无符号数运算:170+124=294,范围外,有进位

有符号数运算:-86+124=28 ,范围内,无溢出

3 什么是8086中的逻辑地址和物理地址?逻辑地址如何转换成物理地址?请将如下逻辑地址用物理地址表达:

1FFFFh:0  240h:17h  32000h:4500h  4B821h:4567h

〔解答〕

在8086处理器中,对应每个物理存储单元都有一个唯一的20位编号,就是物理地址,从00000H~FFFFFH。

在8086内部和用户编程时,采用的段基地址 : 段内偏移地址形式称为逻辑地址。

将逻辑地址中的段地址左移二进制4位(对应16进制是一位,即乘以16),加上偏移地址就得到20位物理地址

如下逻辑地址用物理地址表达:

(1)FFFFh:0=FFFF0H

(2)40h:17h=00417H

(3)2000h:4500h=24500H

4B821h:4567hBC777H

4数据的默认段是哪个,是否允许其他段存放数据?如果允许,如何实现,有什么要求?

〔解答〕

数据的默认段是安排在数据段,也经常安排在附加段,尤其是串操作的目的区必须是附加段,允许其它段存放数据,数据的存放比较灵活的,实际上可以存放在任何一种逻辑段中,这时,只要明确指明是哪个逻辑段就可以了。

5什么是有效地址EA?8086的操作数如果在主存中,有哪些寻址方式可以存取它?

〔解答〕

DS存放数据段的段地址,存储器中操作数的偏移地址则由各种主存方式得到,称之为有效地址EA。8086的操作数如果在主存中,可以存取它的寻址方式有直接寻址方式、寄存器间接寻址方式、寄存器相对寻址方式、基址变址寻址方式、相对基址变址寻址方式

 

6 什么是堆栈,它的工作原则是什么,它的基本操作有哪两个,对应哪两种指令?

〔解答〕

堆栈是一种按“先进后出”原则存取数据的存储区域,位于堆栈段中,使用SS段寄存器记录其段地址;它的工作原则是先进后出;堆栈的两种基本操作是压栈和出栈,对应的指令是PUSH和POP。

 

7 指令指针IP是通用寄存器还是专用寄存器?有指令能够直接它赋值吗?哪类指令的执行会改变它的值?

〔解答〕

指令指针IP不是通用寄存器,不可直接赋值,属于专用寄存器。有且仅有循环、转移、子程序调用和返回、中断类等指令可以改变它的值。

 

8 先提示输入数字“Input Number:0 ~ 9”,然后在下一行显示输入的数字,结束;如果不是键入了0 ~ 9数字,就提示错误“Error!”,继续等待输入数字。

〔解答〕

          ; 数据段

str1      db 'Input Number:0~9 : ',0dh,0ah,'$' 

str2      db 'Error!',0dh,0ah,'$'

          ; 代码段

          mov ah,09h         ; 显示str1字符串

          mov dx,offset str1

          int 21h

getkey:   mov ah,1           ; 调用DOS功能

             int 21h

          cmp  al,'0'

          jb error           ; 小于0出错处理

          cmp al,'9'

          ja error           ; 大于9出错处理

          mov ah,02h         ; 调用DOS显示字符功能显示该数字

          mov dl,al

          int 21h

          ...                ; 终止程序执行返回DOS

error:    mov ah,09h         ; 出错调用DOS 功能显示str2字符串

          mov dx,offset str2

          int 21h

          jmp getkey         ; 返回按键

 

9  从键盘输入一个字符串(不超过255个),将其中的小写字母转换成大写字母,然后按原来的顺序在屏幕上显示。

〔解答〕

思路:参考P67 例2.52用0ah号DOS系统功能调用,从键盘输入一个字符串,然后从键盘缓冲区逐个取字符,在“a”与“z”之间的字符为小写字母,需要转换为大写字母(减去20h),其他不变。

          ;xt237.asm

          .model small

          .stack

          .data

array     db 255

          db 0

array1    db 255 dup('$')

array2    db 0dh,0ah,'$'

          .code

          .startup

          mov ah,0ah            ; 键盘输入字符串

          mov dx,offset array

          int 21h

          mov dx,offset array2      ; 回车换行

          mov ah,09h

          int 21h

          mov bx,offset array1

again:    mov al,[bx]

          cmp al,'$'

          jz done

          cmp al,'a'            ; 小于a和大于z的字符不是小写字母

          jb next

          cmp al,'z'

          ja next

          sub al,20h            ; az之间的字符才是小写字母转换为大写

          mov [bx],al           ; 保存到原位置

next:     inc bx

          jmp again

done:     mov dx,offset array1

          mov ah,09h

          int 21h

          .exit 0

          end

 

10 伪指令语句与硬指令语句的本质区别是什么?伪指令有什么主要作用?

〔解答〕

伪指令语句与硬指令语句的本质区别是能不能产生CPU动作;

伪指令的作用是完成对如存储模式、主存变量、子程序、宏及段定义等很多不产生CPU动作的说明,并在程序执行前由汇编程序完成处理。

 

11 汇编语言程序的开发有哪4个步骤,分别利用什么程序完成、产生什么输出文件。

〔解答〕

  编辑     文本编辑程序       汇编语言源程序.asm

  汇编       汇编程序        目标模块文件.obj

  连接       连接程序         可执行文件.exe或.com

  调试     调试程序          应用程序

 

12源程序中如何指明执行的起始点?源程序应该采用哪个DOS功能调用,实现程序返回DOS?

〔解答〕

源程序中运用STARTUP伪指令指明执行的起始点;源程序应该采用DOS功能调用的4CH子功能实现程序返回DOS的。

 

13 编写一个程序,把从键盘输入的一个小写字母用大写字母显示出来。

〔解答〕

getkey:     mov ah, 1       从键盘输入出口:al存键值

          int 21h

          cmp  al, 'a'       判键值是小写字母

             jb  getkay

             cmp  al, 'z'

             ja  getkay

             sub al,20h     是小写字母转换为大写字母

             mov dl,al

             mov ah, 02h    显示

             int 21h

 

14 编写程序,将一个包含有20个有符号数据的数组arrayM分成两个数组:正数数组arrayP和负数数组arrayN,并分别把这两个数组中的数据个数显示出来。

〔解答〕

           .model small

          include io.inc

          .stack

          .data

 arrayM   db  1,2,3,4,5,6,0,-3,-5,-6,0,7,6,90,-18,-23,34,7,9,8 源数组

 arrayP   db  20 dup(?)     正数数组

 arrayN   db  20 dup(?)     负数数组

 dispP    db 'Plus Number: ','$'

dispN    db 0dh,0ah,'Negs Number: ','$'

          .code

          .startup

          mov cx, 20        源数组元素数

          xor bx, bx        bh为正数个数bl为负数个数均清零

          xor si, si        源数组地址位移量

       again:               循环20

          mov ax, arrayM[si] 取一个元素

          cmp ax,0          判正数

         jl Neg

              inc bh        正数个数加1

         jmp next

  Neg:         inc bl       负数个数加1

  next:        inc si       修改位移量

         loop again         循环次数减1

          mov ah09h       调用显示字符串功能

          mov dx, offset dispP  显示个数

          int  21h

          mov al,bh

          call dispuib       ; 调用I/O子程序库中的子程序

          mov ah09h       调用显示字符串功能

          mov dx, offset dispN  显示个数

          int  21h

          mov al,bl

          call dispuib       ; 调用I/O子程序库中的子程序

         .exit 0

          End

 

15 编写计算100个正整数之和的程序。如果和不超过16位字的范围(65535),则保存其和到wordsum,如超过则显示‘overflow’。

〔解答〕

          .model small

          .stack

          .data

num       equ 100

wlist     dw num dup(?)

wordsum   dw ?

error     db 'overflow. $'

          .code

          .startup

          mov bx,offset wlist

          mov cx,num

          xor ax,ax

again:    add ax,[bx]

          jc next

          inc bx

          inc bx

          loop again

          mov [bx],ax

          jmp done

next:     mov dx,offset error

          mov ah,9

          int 21h

done:     .exit 0

          end

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值