汇编语言期末复习总结(完整版) 联系客服

发布时间 : 星期六 文章汇编语言期末复习总结(完整版)更新完毕开始阅读80cc1b7f6037ee06eff9aef8941ea76e59fa4a2d

..

〔习题1.24〕说明下列指令中源操作数的寻址方式?如果BX=2000H,DI=40H,给出DX的值或有效地址EA的值。

(1) mov dx,[1234h] 直接寻址,EA=1234H (3) mov dx,bx 寄存器寻址,DX=2000H

(6) mov dx,[bx+di] 基址变址寻址,EA=2040H

第2章 8086的指令系统

〔习题2.1〕已知DS=2000H、BX=0100H、SI=0002H,存储单元[20100H]~[20103H]依次存放12 34 56 78H,[21200H]~[21203H]依次存放2A 4C B7 65H,说明下列每条指令执行完后AX寄存器的内容。

(1) mov ax,1200h AX=1200H (2) mov ax,bx AX=0100H

(3) mov ax,[1200h] AX=4C2AH ;偏移地址=1200h (4) mov ax,[bx] AX=3412H ;偏移地址=bx=0100h

(5) mov ax,[bx+1100h] AX=4C2AH ;偏移地址=bx+1100h=1200h

(6) mov ax,[bx+si] AX=7856H ;偏移地址=bx+si=0100h+0002h=0102h (7) mov ax,[bx][si+1100h] AX=65B7H ;偏移地址bx+si+1100h=0100h+0002h+1100h=1202h

〔习题2.2〕指出下列指令的错误

(1) mov cx,dl 两操作数类型不匹配

(2) mov ip,ax IP指令指针禁止用户访问

(3) mov es,1234h 立即数不允许传给段寄存器(DS、CS、SS、ES) (4) mov es,ds 段寄存器之间不允许传送 (5) mov al,300 两操作数类型不匹配 (6) mov [sp],ax 目的操作数应为[ SI ] (7) mov ax,bx+di 源操作数应为 [BX+DI] (8) mov 20h,ah 立即数不能作目的操作数

〔习题2.8〕请分别用一条汇编语言指令完成如下功能:

(1)把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器。 (2)用寄存器BX和SI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加,并把结果送到AL中。

(3)用BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和CX寄存器的内容相加,并把结果送回存储器中。 (4)用位移量为0520H的直接寻址方式把存储器中的一个字与数3412H相加,并把结果送回该存储单元中。

(5)把数0A0H与AL寄存器的内容相加,并把结果送回AL中。 (1)ADD DX,BX

(2)ADD AL,byte ptr [BX+SI] (3)ADD [BX+0B2H],CX

(4)ADD WORD PTR [0520H],3412H (5)ADD AL,0A0H

;.

..

〔习题2.10〕指出下列指令的错误:

(1) xchg [si],30h xchg的操作数不能是立即数 (2) pop cs 不应对CS直接赋值

(3) sub [si],[di] 两个操作数不能都是存储单元 (4) push ah 堆栈的操作数不能是字节变量 (5) adc ax,ds adc的操作数不能是段寄存器 (6) add [si],80h 没有确定是字节还是字操作 (7) shl [si] ,1 没有指定指向数据的大小 (8) ror dx, al al应该换成cl

〔习题2.22〕假设AX和SI存放的是有符号数,DX和DI存放的是无符号数,请用比较指令和条件转移指令实现以下判断: (1)若DX > DI,转到above执行 cmp dx,di

ja above ;=jnbe above (2)若AX > SI,转到greater执行 cmp ax,si

jg greater ;=jnle greater (3)若CX = 0,转到zero执行 cmp cx,0

jz zero ;= jcxz zero

〔习题2.25〕对下面要求,分别给出3种方法,每种方法只用一条指令。 (1)使CF=0 (2)使AX=0 (1)解答:

clc(清零)

and ax,ax(逻辑操作不会进位) or ax,ax (2)解答: xor ax,ax and ax,0 mov ax,0

〔习题3.7〕假设myword是一个字变量,mybyte1和mybyte2是两个字节变量,指出下列语句中的错误原因。

(1) mov byte ptr [bx],1000 1000超出了一个字节范围

(2) mov bx,offset myword[si] 寄存器的值只有程序执行时才能确定,而offset是汇编过程计算的偏移地址,故无法确定,改为lea bx,myword[si]

(3) cmp mybyte1,mybyte2 两个都是存储单元,指令不允许

(4) mov al,mybyte1+mybyte2 变量值只有执行时才确定,汇编过程不能计算 (5) sub al,myword 字节量AL与字变量myword,类型不匹配

(6) jnz myword Jnz指令只有相对寻址方式,不支持间接寻址方式 〔〔习题3.10〕画图说明下列语句分配的存储空间及初始化的数据值: (1) byte_var DB ’ABC’,10,10h,’EF’,3 DUP(-1,?,3 DUP(4)) (2) word_var DW 10h,-5,’EF’,3 DUP(?)

(1)从低地址开始,依次是(十六进制表达):

;.

..

41 42 43 0a 10 45 46 ff - 04 04 04 ff - 04 04 04 ff - 04 04 04 (2)从低地址开始,依次是(十六进制表达): 10 00 FB FF 46 45 - - - - - -

〔习题3.11〕请设置一个数据段mydataseg,按照如下要求定义变量: (1) my1b为字符串变量:Personal Computer (2) my2b为用十进制数表示的字节变量:20 (4) my4b为用二进制数表示的字节变量:20 (5) my5w为20个未赋值的字变量 (6) my6c为100的常量

(7) my7c表示字符串:Personal Computer mydataseg segment

my1b db ‘Personal Computer’ my2b db 20

my3b db 14h ;20h my4b db 00010100b my5w dw 20 dup(?)

my6c equ 100 ;my6c = 100 my7c equ mydataseg ends

第4章 基本汇编语言程序设计

〔习题4.6〕编制一个程序,把变量bufX和bufY中较大者存入bufZ;若两者相等,则把其中之一存入bufZ中。假设变量存放的是8位无符号数。 .model small .stack 256 .data bufx db ? bufY db ? bufz db ? .code .startup

mov al, bufX mov bl, bufY cmp al,bl ja next

mov bufZ, bl jmp done

next: mov bufZ, al done: .exit 0 End

;.

..

大题

1.显示HelloWorld字符串。 .model small ;定义程序的存储模型,一般程序采用小型模型 .stack ;堆栈段 .data ;数据段 string db 'Hello World!',0dh,0ah,'$' ;定义需要显示的字符串 .code ;代码段 .startup ;程序的起始点,建立DS、SS内容 mov dx,offset string ;指定字符串在数据段的偏移地址 mov ah,9 int 21h ;调用功能调用显示信息 .exit 0 ;程序结束点,返回DOS end ;汇编结束 2.COM程序实现任意键后响铃 .model tiny .code .startup mov dx,offset string mov ah,9 ;9号调用输出字符串 int 21h mov ah,01h ;1号调用,从stdin读取字符 int 21h mov ah,02h mov dl,07h int 21h ;2号调用,向stdout输出字符(07H-\\a响铃) .exit 0 string db 'Press any key to continue!$' ;数据安排在不与代码冲突的地方 end 3.设有一个64位的数据,要求将它算术左移8位(从高字节开始,从右向左左移8位) .model stmall .stack .data qvar dq 1234567887654321h ;dq表示4个字4*16 = 64bytes .code .startup mov cx,7 mov si,6 ;1 ;.