汇编答案

  • 格式:doc
  • 大小:45.50 KB
  • 文档页数:7

习题四

4.4 什么是“近程”转移?什么是“远程”转移?它们的实现方法有什么不同?

答:执行“近程”转移时,转移的目的地与出发地在同一个段内,它们具有相同的段基址。因此,为了实现“近程”转移,只需要改变IP寄存器的值。“远程”转移的目的地与出发地不在同一个段,为了实现这个转移,必须同时改变CS和IP寄存器的值。

4.5 已知(AX)= 836BH,X分别取下列值,执行“CMP AX, X”后,标志位ZF、CF、OF、SF各是什么?

(1)X=3000H (2)X=8000H (3)X=7FFFH (4)X=0FFFFH (5)X=0

答:上述指令执行后,标志位ZF、CF、OF、SF 的状态分别是:

(1) ZCOS=0010 (2) ZCOS=0000 (3) ZCOS=0010 (4) ZCOS=0101

(5) ZCOS=0001

4.6 已知(AX)= 836BH,X分别取下列值,执行“TEST AX, X”后,标志位ZF、CF、OF、SF各是什么?

(1)X=0001H (2)X=8000H (3)X=0007H (4)X=0FFFFH (5)X=0

答:上述指令执行后,标志位ZF、CF、OF、SF 的状态分别是:

(1) ZCOS=0000 (2) ZCOS=0001 (3) ZCOS=0000 (4) ZCOS=0001

(5) ZCOS=1000

4.7 测试名为X的一个字节,如果X的第1,3位均为1,转移到L1,如果只有一位为1,转移到L2,如果两位全为0,转移到L3。写出对应的指令序列。

答: MOV AL, X

AND AL, 0000 1010B

JZ L3

CMP AL, 0000 1010B

JE L1

JMP L2

4.9 编写指令序列,将AX和BX中较大的绝对值存入AX,较小的绝对值存入BX。

答: AND AX, AX

JGE SKIP1

NEG AX

SKIP1: AND BX, BX

JGE SKIP2

NEG BX

SKIP2: CMP AX, BX

JGE SKIP3

XCHG AX, BX

SKIP3: ……

4.10 编写指令序列,比较AX、BX中的数的绝对值,绝对值较大的数存入AX,绝对值较小的数存入BX。

答: PUSH AX

PUSH BX

AND AX, AX

JGE SKIP1

NEG AX

SKIP1: AND BX, BX

JGE SKIP2

NEG BX

SKIP2: CMP AX, BX

POP BX

POP AX

JGE SKIP3

XCHG AX, BX

SKIP3: ……

4.11 编写指令序列,如果AL寄存器存放的是小写字母,把它转换成大写字母,否则不改变AL内容。

答: CMP AL, ‘a’

JB DONE

CMP AL, ‘z’

JA DONE

SUB AL, ‘a’-‘A’

DONE: ……

4.12 计算分段函数:2653XXY

3322XXX

X的值从键盘输入,Y的值送显示器输出。

答: INCLUDE YLIB.H

DATA SEGEMNT

MESS1 DB 0DH, 0AH, ‘Input value of X please : $’

MESS2 DB 0DH, 0AH, ‘ Y= : $’

DATA ENDS

CODE SEGMENT

ASSUME CS: CODE, DS: DATA

START:

MOV AX, DATA

MOV DS, AX

LEA DX, MESS1 CALL READINT ;输入X的值

CMP AX, -2

JGE L2

L1: SUB AX, 3 ;AX←X-3

JMP DONE

L2: CMP AX, 3

JG L3

MOV BX, AX

ADD AX, AX ;AX←2X

ADD AX, AX ;AX←4X

ADD AX, BX ;AX←5X

ADD AX, 6 ;AX←5X+6

JMP DONE

L3: MOV AX, 2 ;AX←2

DONE:

LEA DX, MESS2

CALL WRITEINT ;输出Y的值

CALL CRLF

MOV AX, 4C00H

INT 21H

CODE ENDS

END START

4.14 编写程序,求10元素字数组LIST中绝对值最小的数,存入MIN单元。

答: DATA SEGEMNT

LIST DW -56, +12, 88, -126, -5, 16, 32, -99, 72, -18

MIN DW ?

MINABS DW ?

DATA ENDS

CODE SEGMENT

ASSUME CS: CODE, DS: DATA

START:

MOV AX, DATA

MOV DS, AX

MOV AX, LIST

MOV MIN, AX ;将数组第一个元素假设为绝对值最小的数

MOV MINABS, 32767 ;最小的绝对值假设为32767

LEA SI, LIST

MOV CX, 10

AGAIN: MOV AX, [SI]

CMP AX, 0

JGE SKIP1

NEG AX ;求绝对值 SKIP1: CMP AX, MINABS ;绝对值与假设的最小绝对值比较

JGE SKIP2 ;假设的绝对值较小,跳过

MOV MINABS, AX ;保存新的最小绝对值

MOV AX, [SI] ;取出新的绝对值最小的数

MOV MIN, AX ;保留新的绝对值最小的数

SKIP2: ADD SI, 2

LOOP AGAIN

MOV AX, 4C00H

INT 21H

CODE ENDS

END START

说明:一定要预设最小的绝对值和绝对值最小的数,而且这个绝对值最小的数必须来自LIST数组。

4.21编写程序,把一个30个元素的有符号字数组ARRAY按照各元素的正负分别送入数组P和M,正数和零元素送P数组,负数送M数组。

答: DATA SEGEMNT

ARRAY DW 30 DUP(?) ;汇编之前置入数据

P DW 30 DUP(?)

M DW 30 DUP(?)

DATA ENDS

CODE SEGMENT

ASSUME CS: CODE, DS: DATA

START:

MOV AX, DATA

MOV DS, AX

LEA BX, ARRAY ;ARRAY数组指针

MOV SI, 0 ;P数组指针

MOV DI, 0 ;M数组指针

MOV CX, 30

ONE: MOV AX, [BX] ;从ARRAY数组取出一个数据

AND AX, AL

JGE PLUS ;正数、零转PLUS

MINUS: MOV M[DI], AX ;负数存入M数组

ADD DI, 2

JMP NEXT

PLUS: MOV P[SI], AX ;正数、零存入P数组

ADD SI, 2

NEXT: ADD BX, 2

LOOP ONE

MOV AX, 4C00H

INT 21H CODE ENDS

END START

4.22 缓冲区BUFFER中存放有字符串,以0为结束标志。编写程序,把字符串中的大写字母转换成小写字母。

答: DATA SEGEMNT

BUFFER DB ‘A String for Test.’, 0

DATA ENDS

CODE SEGMENT

ASSUME CS: CODE, DS: DATA

START:

MOV AX, DATA

MOV DS, AX

LEA BX, BUFFER ;BUFFER缓冲区指针

ONE: MOV AL, [BX] ;从缓冲区取出一个字符

AND AL, AL

JZ QUIT ;为零,处理完成

CMP AL, ‘A’

JB NEXT

CMP AL, ‘Z’

JA NEXT

ADD AL, ‘a’-‘A’

MOV [BX], AL

NEXT: INC BX

JMP ONE

QUIT: MOV AX, 4C00H

INT 21H

CODE ENDS

END START

4.23

4.24 编写程序,从键盘上输入一个字符串,统计其中数字字符,小写字母,大写字母,空格的个数并显示。

答:

INCLUDE YLIB.H

CODE SEGMENT

ASSUME CS: CODE

MESS1 DB 0DH, 0AH, ‘Input a string please : $’

BUFFER DB 81, ?, 81 DUP(?)

MESS2 DB 0DH, 0AH, ‘Digits: $’

MESS3 DB 0DH, 0AH, ‘Uppercase alphabet: $’

MESS4 DB 0DH, 0AH, ‘Lowercase alphabet: $’

MESS5 DB 0DH, 0AH, ‘Space : $’

START:

PUSH CS