汇编作业题答案 下载本文

16 一个双字长有符号数存放在DX(高位)AX(低位)中,写出求该数相反数的

指令序列。

结果仍存入DX,AX寄存器

解:NOT DX ;首先将(DX, AX)取反 NOT AX ADD AX, 1 ;最低位加1,注意:不能用INC指令 ADC DX, 0 ;把进位(如果有)传递到高位

17 指令DEC BX和SUB BX, 1的执行结果一样吗?请分析。

解:指令DEC BX和SUB BX, 1分别执行后,BX寄存器内的值相同,但是CF标

志位的状

态可能不同,这是由于DEC指令执行后不改变CF的状态。

18 已知内存变量X, Y, Z均由“DB”伪操作定义,按照以下要求,使用MOVZX

或MOVSX指令进行位数扩展,求三个数的16b和。 (1) 如果X,Y,Z为无符号数 (2) 如果X,Y,Z为有符号数 解:(1) MOVZX AX, X MOVZX BX, Y ADD AX, BX MOVZX BX, Z ADD AX, BX (2) MOVSX AX, X

MOVSX BX, Y

ADD AX, BX MOVSX BX, Z ADD AX, BX

19 内存缓冲区BUFFER定义如下,按照要求,写出指令序列 BUFFER DB 20 DUP(?)

(1) 将缓冲区全部置为0,并使执行时间最短

(2) 将缓冲区全部置为空格字符(ASCII代码20H),使用的指令条数最少 (3) 将缓冲区各字节依次设置为0,1,2,3,4,??,19

(4) 将缓冲区各字节依次设置为0,-1,-2,-3,-4,??,-19 (5) 将缓冲区各字节依次设置为30,29,28,27,??,11 (6) 将缓冲区各字节依次设置为0,2,4,6,8,??,38

(7) 将缓冲区各字节依次设置为0,1,2,3,0,1,2,3,??,3 解:

(1) XOR EAX, EAX MOV DWORD PTR [BUFFER], EAX MOV DWORD PTR [BUFFER+4], EAX MOV DWORD PTR [BUFFER+8], EAX

MOV DWORD PTR [BUFFER+12], EAX MOV DWORD PTR [BUFFER+16], EAX (2) MOV AL, 20H MOV CX, 20 LEA BX, BUFFER ONE:MOV [BX], AL INC BX LOOP ONE (3) XOR BX, BX MOV CX, 20

ONE:MOV BUFFER[BX], BL INC BX LOOP ONE (4) XOR BX, BX XOR AL, AL MOV CX, 20

ONE:MOV BUFFER[BX], AL INC BX DEC AL

LOOP ONE (5) XOR BX, BX MOV AL, 30 MOV CX, 20

ONE:MOV BUFFER[BX], AL INC BX DEC AL

LOOP ONE (6) XOR BX, BX XOR AL, AL MOV CX, 20

ONE:MOV BUFFER[BX], AL INC BX ADD AL, 2 LOOP ONE (7) XOR BX, BX MOV CX, 5 ONE:

MOV BUFFER[BX], 0 MOV BUFFER[BX+1], 1 MOV BUFFER[BX+2], 2 MOV BUFFER[BX+3], 3

ADD BX, 4 LOOP ONE

20 编写循环结构程序,进行下列计算,结果存入RESULT内存单元 (1) 1+2+3+4+5+6+ ?? +100 (2) 1+3+5+7+9+11+ ?? +99 (3) 2+4+6+8+10+ ?? +100 (4) 1+4+7+10+13+ ?? +100 (5) 11+22+33+44+ ?? +99 解:

(1) CODE SEGMENT

ASSUME CS: CODE RESULT DW ? START:

XOR AX, AX MOV CX, 100 AGAIN: ADD AX, CX LOOP AGAIN MOV RESULT, AX MOV AX, 4C00H INT 21H CODE ENDS END START (2)CODE SEGMENT

ASSUME CS: CODE RESULT DW ? START:

XOR AX, AX MOV CX, 50 MOV BX, 1 AGAIN: ADD AX, BX ADD BX, 2 LOOP AGAIN MOV RESULT, AX MOV AX, 4C00H INT 21H CODE ENDS END START

(3) CODE SEGMENT

ASSUME CS: CODE RESULT DW ? START:

XOR AX, AX MOV CX, 50 MOV BX, 2 AGAIN: ADD AX, BX

ADD BX, 2 LOOP AGAIN MOV RESULT, AX MOV AX, 4C00H INT 21H CODE ENDS END START

(4) CODE SEGMENT

ASSUME CS: CODE RESULT DW ? START:

XOR AX, AX MOV CX, 34 MOV BX, 1 AGAIN: ADD AX, BX ADD BX, 3 LOOP AGAIN MOV RESULT, AX MOV AX, 4C00H INT 21H CODE ENDS END START

(5) CODE SEGMENT

ASSUME CS: CODE RESULT DW ? START:

XOR AX, AX MOV CX, 9 MOV BX, 11 AGAIN: ADD AX, BX ADD BX, 11 LOOP AGAIN MOV RESULT, AX MOV AX, 4C00H INT 21H CODE ENDS END START

21 已知ARRAY是5行5列的有符号字数组,编写程序,进行下列计算(假设和

仍然为

16b,不会产生溢出)

(1) 求该数组第4列所有元素之和(列号从0开始) (2) 求该数组第3行所有元素之和(行号从0开始) (3) 求该数组正对角线上所有元素之和 (4) 求该数组反对角线上所有元素之和 解:假设数据段已定义如下: DATA SEGMENT

ARRAY DW 1, 6, 9, 23,12 ;定义数组ARRAY DW 54, 23, 15, -92, 37 ;每一行5个数据 DW -99, 231, 76, 81, 90 ;共5行

DW 33, 67, 81, -99, 0 ;共计25个数据 DW 123, -52, 77, -180, 89 SUM DW ? ;SUM存放结果 DATA ENDS

(1)CODE SEGMENT

ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX MOV AX, 0 ;累加器在循环之前清零 MOV CX, 5 ;计数器置初值 MOV SI, 4*2 ;第1行第4列元素在数组内的位移 NEXT: ADD AX, ARRAY[SI] ADD SI, 5*2 ;SI指向下一行第4列元素 LOOP NEXT MOV SUM, AX MOV AX, 4C00H INT 21H CODE ENDS END START

(2)CODE SEGMENT

ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX MOV AX, 0 ;累加器在循环之前清零 MOV CX, 5 ;计数器置初值 MOV SI, 3*5*2 ;第3行第0列元素在数组内的位移 NEXT: ADD AX, ARRAY[SI] ADD SI, 2 ;SI指向本行下一列元素 LOOP NEXT MOV SUM, AX MOV AX, 4C00H INT 21H CODE ENDS