汇编语言作业汇总

2018-11-12 21:09

第1章作业

作业

教材P15 习题 1.1 (2)

1.2 (1) (2) (3) 1.5 (2) (3) 1.7 (1) (2) (3) 1.8 (2) (4) 1.9 (2) (3)

(参考答案略)

参考答案

(略)

第2章作业

作业

教材P26-27习题 2.2 2.4 2.6 2.8

参考答案

(略)

第 1 页 共 10 页

第3章作业

作业

教材P71-72习题 3.1 3.2

3.4 (2) (4) (6)+(1)(5) 3.7 3.9

补充说明:

(1)对于3.1题,当操作数是存储器操作数时,注意区分内存操作数的物理地址与存储单元的内容!

(2)对于3.2题,不仅要能够判断,如果出错,还要知道具体出错的原因。

(3)对于3.7和3.9,要能够分析出每一条指令执行完后,目的操作数中寄存器的内容是什么。

参考答案 3.1

注意题目要求:源操作数的寻址方式,并计算相应的物理地址

(1) mov ax, bx 寄存器寻址 (2) mov ax, [bx] 寄存器间接寻址 (3) mov ax, table[si] 变址寻址

物理地址= (ds)×16+(si) +table = 31804H 物理地址= (ds)×16+(bx) = 30700H

因为操作数是寄存器操作数,所以无相应的物理地址

(4) mov ax, [bp]disp 基址寻址

物理地址= (ss)×16+(bp)+disp = 41700H

(5) mov ax, [bx][di] 基址变址寻址

物理地址= (ds)×16+(bx)+(di) = 30800H

(6) mov ax, [bp][si]table 相对基址变址寻址

物理地址= (ss)×16+(bp)+(si)+table = 42504H

第 2 页 共 10 页

3.2

注意题目要求:源8086/8088微处理器 (1) sub ax, [bx+bp]

× 错误原因: 对于源操作数,没有这种寻址方式 (2) add value1,value2

× 错误原因:源操作数和目的操作数不能同时为存储器操作数 (3) rol [bx][di],3

× 错误原因:当移位次数大于1时,要先把移位次数送入cl寄存器

即:mov cl, 3

rol

[bx][di], cl

(4) not bx, dx × 错误原因:

(5) mov ds, 1000h

× 错误原因: 不能把立即数送入段寄存器

(6) mov cs, ax

× 错误原因: cs寄存器不能作为目的操作数 (7) cmp 1000h, bx

× 错误原因:目的操作数不能为立即数 (8) mov value1, cx √

(9) mov ds, es

× 错误原因:两个段寄存器之间不能直接进行传送操作 (10) push cs √

(11) push 2a00h

× 错误原因: push指令的操作数只能是16位寄存器操作数或16位存储器操作数 备注: 由于本题题目中指出针对8086/8088微处理器,故此指令用法错误。若针对386以上

第 3 页 共 10 页

not指令只能有一个操作数

微处理,则正确。 (12) in

100h, al

× 错误原因: 源操作数和目的操作数均不符合in指令的语法格式

备注:具体语法格式可参见第3章课件或教材,这里只列举四个书写正确的实例。

① in ② in

al, 50h

表示从50h端口读入一个字节数据送入al

ax, 50h 表示从50h端口读入一个字数据送入ax

③ mov dx, 100h in

al, dx

表示从100h端口读入一个字节数据送入al

④ mov dl, 100h

in

al, dx

表示从100h端口读入一个字数据送入ax

③和④即说明,当端口号超过ffh(即255)时,要先将端口号送入dx (13) lea bx, 4300h × 错误原因: (14) mov ax, [cx] × 错误原因:

用于寄存器间接寻址的寄存器只能是bx,bp,si,di之一。 立即数不存在偏移地址

3.4

ps:符合要求的指令或程序段不止一种,这里只给出一种参考。 (1) mov ax, 0 and ax,0 (2) mov cl,4

rol bl,cl

(4) and bx,0f7afH

或: and bx, 1111011110101111B 或: btr bx,4 btr bx,6 btr bx,11

注: 指令btr的用法请参照教材P69

(5) xor ax, 0100000000100000B 或 xor ax, 4020H (6) test dx,0001h jnz L1 …

L1: … ; b0位为1

test dx, 0200h jnz L2

第 4 页 共 10 页

L2: … ; b9位为1

或: bt dx, 0 bt dx, 9

注: 指令bt的用法请参照教材P69

3.7

(ax) = 8D00H

(cx) = 0004H

3.9

(bx) = D36AH

第4章作业

作业

教材P93-94习题 4.2 (1)(2)(3)(4) 4.3 (3) 4.4 4.7 4.8

补充说明:

(1)对于4.7,要结合题目明确理解伪指令org, $的含义和用途,能够举一反三。另外注意,对于用equ或=定义的常量是不占用内存单元的。比如这里的data1和data2。 (2)结合第4章课件中的例题掌握伪指令label和运算符ptr的用法。

参考答案 4.2

注意: 题目要求的变量的类型是字节变量还是字变量

(1)此题可以有多种写法(结合右图示理解) 定义方法一:

第 5 页 共 10 页

data1

86h 27h 23h 00h 24h 1ah

低 高

data1 db 86h, 27h, 23h, 00h, 24h, 1ah 定义方法二: data1 label byte x dw 2786h, 0023h, 1a24h 定义方法三: data1 equ this byte x dw 2786h, 0023h, 1a24h

注意:在定义方法二、三中,data1是一个符号,与x占用的是同一空间

(2)此题可以有三种定义方法(结合右图示理解) data2 30h 定义方法一: 0b4h data2 dw 0b430h, 1062h 62h 定义方法二: 10h data2 label word x db 30h, 0b4h, 62h,10h 定义方法三: data2 equ this word x db 30h, 0b4h, 62h,10h

注意:在定义方法二、三中,data2是一个符号,与x占用的是同一空间

(3)data3 db 4 dup (20h), 20, 0, 6 dup(1,2)

(4)此题可以有两种定义方法 定义方法一: data1 label word data2 db 10h, 00h, 41h, 42h 定义方法二: data1 equ this word data2 db 10h, 00h, 41h, 42h

4.3

var3

2 2 低 20h 20h 20h 高

2 2 20h 20h 20h 2 2 20h

20h 20h 第 6 页 共 10 页

低 高

4.4

d_seg segment para ‘data’ infor1 db 01111111B infor2 db ’EXAMPLE’ infor5 equ $-infor2 infor3 dw 0ffffh infor4 dw 4231h d_seg ends

注意:题目要求,如要求infor5为数值常量等

4.7

(1) var1的偏移量30h, var2的偏移量3ah (2) 符号常量cnt的值10h (3) var2+2单元的内容为2

4.8

D_SEG SEGMENT PARA STACK FLD1 DB 0,256,A FLD2 DW A400H,60H FLD3 DB THIS IS COMPUTER FLD4 DW 0,4000H,’ABCD’ D_SEG ENDP

C_SEG SEGMENT PARA ‘CODE’ ASSUME CS:C_SEG DS:D_SEG MAIN PROC FAR ... LEA SI, FLD1

S1: MOV D1, OFFSET FLD2 MOV AX, [SI] MOV [DI],4200H

第 7 页 共 10 页

...

MAIN ENDP C_SEG ENDS END S1

第5章作业

教材P107习题 5.1 5.3

补充说明:

(1)对于5.3,注意程序结束时的终止结点!

参考答案

(略)

第6章作业

作业

教材: P133-134 6.2 6.5 6.7 ps:

(1)6.2题目更正: P143最后一行 inc 改为 inc si (2)6.7提示:

利用int 21h的1号功能和循环完成字符串的输入。

第 8 页 共 10 页

参考答案(部分) 6.2

说明:

第1次运行完指令inc si时,(al) = 08H

至于cx寄存器的值,题目表述的有些不清楚。

如果是指第一次执行完inc si并且还未执行loop cx指令,则(cx)= 10 如果是指第一次执行完inc si并且还已执行loop cx指令,则(cx)= 9

6.7

参考思路:

利用堆栈“先入后出”的特性,每输入一个字符即压入堆栈,待全部输入完毕后,再一次执行弹栈操作,随即输出,从而实现字符串的逆序输出。

与该思路对应的程序实现: code segment

assume cs:code main proc far push ds mov ax,0 push ax mov cx,0 input: mov ah,1 int 21h inc cx push ax cmp al,'$' jnz input pop dx dec cx output: pop dx mov ah,2 int 21h loop output ret main endp code ends

end main

第 9 页 共 10 页

关于参考代码的其他几点说明:

(1)在8086/8088中压栈/弹栈操作只能以字数据为单位。故尽管输入的字符是在dl寄存器中,入栈时是把dx压入堆栈的。同样,弹出时,是从堆栈中弹出字数据到dx,不过程序要输出的字符只在低8位即dl寄存器中。

第 10 页 共 10 页


汇编语言作业汇总.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:浅析导游服务质量存在问题及解决对策

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: