汇编语言作业汇总

发布 2022-07-17 05:32:28 阅读 8855

教材p15 习题。

参***略)

略)教材p26-27习题。

略)教材p71-72习题。

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

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

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

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

1) mov ax, bx

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

2) mov ax, [bx]

寄存器间接寻址物理地址= (ds)×16+(bx) =30700h

3) mov ax, table[si]

变址寻址物理地址= (ds)×16+(si) +table = 31804h

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

注意题目要求:源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

错误原因: not指令只能有一个操作数。

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以上微处理,则正确。

12) in 100h, al

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

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

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

② in 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之一。

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

l1b0位为1

test dx, 0200h

jnz l2

l2b9位为1

或: bt dx, 0

bt dx, 9

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

ax) =8d00h (cx) =0004h

bx) =d36ah

教材p93-94习题。

补充说明:1)对于4.7,要结合题目明确理解伪指令org, $的含义和用途,能够举一反三。

另外注意,对于用equ或=定义的常量是不占用内存单元的。比如这里的data1和data2。

2)结合第4章课件中的例题掌握伪指令label和运算符ptr的用法。

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

1)此题可以有多种写法(结合右图示理解)

定义方法一:

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 dw 0b430h, 1062h

定义方法二:

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

d_seg segment para ‘data’

infor1 db 01111111b

infor2 db ’example’

infor5 equ $-infor2

infor3 dw 0ffffh

infor4 dw 4231h

d_seg ends

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

1) var1的偏移量30h, var2的偏移量3ah

2) 符号常量cnt的值10h

3) var2+2单元的内容为2

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

main endp

c_seg ends

end s1

教材p107习题。

补充说明:1)对于5.3,注意程序结束时的终止结点!

略)教材: p133-134

ps: 1)6.2题目更正: p143最后一行 inc 改为 inc si

2)6.7提示:

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

说明:第1次运行完指令inc si时,(al) =08h

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

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

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

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

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

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

retmain endp

code ends

end main

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

汇编语言补充作业

微机系统与接 术 汇编补充作业。1.寻址方式小结。请根据已填的格式,完成下面表中的空白部分 2.指出下列8088指令的错误 1 mov ah,bx 2 mov bx si 3 mov ax,si di 4 mov mydat bx si es ax 5 mov bl,1000 6 mov cs,ax...

汇编语言程序设计作业

题1.编写汇编语言源程序实现从键盘上输入1949至2049年中的某一日,计算并输出该日是这一年的第几天以及星期几。1 提示 通过输入的年 year 月 month 日 day 来计算该日是年内第几天 days 再以 year 1 year 1 4 year 1 100 year 1 400 days...

汇编语言程序设计作业

冒泡法排序 题目 1.程序简介 采用冒泡法进行排序 2.流程图 3 实现输入数据直接在程序中通过数组定义,或用文件方式读入,不要采用scanf include using namespace std define count 20数据个数。void bubblesort long array,int...