IBMPC汇编语言程序设计第二版课后习题答案清华大学

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

您正在查看 "ibm-pc汇编语言程序设计(第二版课后习题答案" 分类下的文章
IBM-PC汇编语言程序设计(第二版课后习题答案(清华大学出版社(沈美明,温冬蝉著第三章答案1-222006-11-02 22:56
IBM-PC汇编语言程序设计(第二版课后习题答案(清华大学出版社(沈美明,温冬蝉著答案
1。

.(1立即寻址没有
(2直接寻址 7237H
(3使用BX的寄存器寻址没有
(4使用BX的间接寻址 637DH
(5使用BX的寄存器相对寻址 0D5F0H
(6 基址变址寻址 8E18H
(7相对基址变址 004FH
2。

根据下列要求,写出相应的汇编指令。

(1ADD DX,BX
(2 ADD AL,[BX][SI]
(3 ADD [BX][0B2H], CX
(4 MOV AX,2A59H ADD [0524H] ,AX
(5 ADD AL ,0B5H
3。

(1寄存器间接寻址
MOV BX,OFFSET [BLOCK][0AH]
MOV DX ,[BX]
(2寄存器相对寻址
MOV SI,OAH
MOV DX,[BLOCK][SI]
(3基址变址寻址
MOV BX ,BLOCK
MOV SI,OAH
MOV DX,[BX][SI]
没人来看,还是要写~~
4。

现有(DS
=2000H,(BX=0100H,(SI=0002H,(20100=12H,(20101=34H,(20102=56H,(20103=7 8H,(21200=2 AH,(20201=4CH,(21202=B7H,(21203=65H,试说明下列各条指令执行完后,AX寄存器的内容。

(1MOV AX,1200H 1200H
(2 MOV AX,BX 0100H
(3 MOV AX,[1200] 4C2AH 注意,是字单元!!
(4MOV AX,[BX] 3412H 同上
(5MOV 1100[BX] 4C2AH
(6 MOV AX,[BX][SI] 7856H
(7 MOV AX,1100[BX][SI] 65B7H
5。

(1 7CD9H (2 1200H (3 6319H
6。

MOV BX,2000H
LES DI ,[BX]
MOV AX, ES:DI
7。

转向地址OBJ的值分别为:(1064DH (20691H (305E0H 注意有符号数的符号位~~
8。

(1 MOV AX,0ABH 立即数寻址
无物理地址
(2MOV AX,BX 寄存器寻址
同上
(3MOV AX,[100] 直接寻址
20100H
(4MOV AX,VAL 直接寻址
20050H
(5 MOV AX,[BX] 寄存器间接寻址
20100H
(6 MOV AX,ES:[BX] 直接寻址
21100H
(7 MOV AX,[BP] 寄存器间接寻址
20010H
(8MOV AX,[SI] 同上
200A0H
(9 MOV AX,[BX+10] 寄存器相对寻址
20110H
(10MOV AX,VAL[BX] 同上
20150H
(11 MOV AX,[BX][SI] 基址变址寻址
201A0H
(12 MOV AX,VAL[BX][SI] 相对基相变址寻址201F0H
9。

(1的指令: MOV AX, [BX][0CH] MOV ZREO ,AX (2 的指令: MOV AX,ARRAY[BX] MOV ZREO,AX
10。

MOV AX,TABLE 是把符号地址TABLE里的内容送到AX里,指令执行完后,(AX=1234H
LEA AX,TABLE 是把符号地址TABLE 的有效地址(这里是偏移量送到指定寄存器AX里,指
令执行完后,(AX=0032H
11。

执行完指令后,(AX=1E00H
12。

LEA AX,CSTRING
MOV DL,AX
MOV DH,[AX+6]
13。

这个,,图,很麻烦了,所以就不画了~~大家可以看一下课本上P51--P53,很清楚,看完了这道韪也会了~~~
14。

LES BX,[2000]
MOV AX,ES:[BX]
注意:一开始我写的是: MOV AX,ES:[8000H],后来看到题目里要求写两条指令,所以一条就不行了,就要画蛇添足~~~
15。

运算结果 SF,ZF,CF,OF各位的值(从左至右依次往下~
(1 74D4H 0 0 0 0
(2 A5C1H 1 0 0 1
(3 4240 H 0 0 1 0
(4 0000 H 0 1 1 0
16。

接上表~
(1 5D14 0 0 0 0
(2 A870 1 0 0 1
(3 D870 1 0 0 0
(4 34E4 0 0 1 0
17。

(1.MOV AX,Z ;把Z送到AX
SUB AX,X ;Z-X
ADD AX,W ;W+(Z-X
MOV Z,AX ;结果保存在Z中
(2. MOV AX,R ;R送到AX中
ADD AX,9 ;R+9
MOV BX,X ;X送到BX中
ADD BX,6 ;X+6
ADD AX,BX ;(R+9+(X+6,结果保存在AX中
MOV BX,W ; W送到BX中
SUB BX,AX ; W-(R+9-(X+6,连续减去两个数,相当于减去这两个数的和~~ MOV Z,BX ;最终结果送到Z中
(3
MOV AX,W ;把W送到AX
IMUL X ;W*X 注意:低十六位保存在AX里,高十六位保存在DX里
MOV BX,Y ;把Y送到BX 里
ADD BX,6 ;Y+6
IDIV BX ;(W*X/(Y+6 注意:商保存在AX里,余数保存在DX里
MOV Z,AX ;把商送到Z中,
MOV R,DX ;把余数送到R中
(4
MOV AX,W ;把W送到AX中
SUB AX,X ;W-X
CWD ;把AX中的十六位带符号数扩展成为32位,低十六位保存在AX 中,高十六位保
;在DX中
MOV BX,5 ;把5送到BX中
IDIV BX ;(W-X/5 被除数为32位,除数为16位商为16

IMUL Y ;上一步结果再乖以Y,积为32位
MOV BX,2 ;把2送到BX中
IMUL BX ;上一步乘法所得的积再乘以2,各为64位
MOV Z,EAX ;把结果中低32位放入Z双字单元中MOV [Z+4],EDX ;把结果中高32位放入Z+4双字单元中18。

指令本条指令执行完后AX的内容
执行完后CF,SF,ZF的值
MOV AX,1234H 1234H 0 0 0
MOV CL,4 1234H 0 0 0
ROL AX,CL 2341H 1 0 0
DEC AX 2340H 1 0 0
MOV CX,4 2340H 1 0 0
MUL CX 8918H 0 0 0
INT 20H
程序结束后,(AX=8918H (DX=0000H
19。

指令执行完后AX的内容
执行完后CF ,SF,ZF和OF的值
MOV AX,0 0 0010
DEC AX FFFFH 0100
ADD AX,7FFFH 7FFEH
0000
ADD AX,2 8000H 0101 NOT AX 7FFFH 0101 SUB AX,0FFFFH 8000H 1101
ADD AX,8000H 0000H 1011
SUB AX,1 FFFFH 1101 AND AX,58D1H 58D1H 0000
SAL AX,1 B1A2H 0101 SAR AX,1 D8D1H 0100 NEG AX 272FH 1000 ROR AX,1 9397H 1001 20。

(1MOV AX,DATAX ADD DATAY,AX
(2MOV AX,DATAX ADD DATAY,AX
MOV AX,[DATAX+2]
ADD [DATAY+2] ,AX
(3本組指令的作用是:BX <------[DATAX]+[DATAY]+[1](CF的值帶進位加法~ (4MOV AX,DATAX
MUL DATAY ;結果的高十六位保存在DX裏,低十六位保存在AX裏
(5MOV AX,DATAX
MOV DX,[DATAX+2]
MUL DWORD DATAY ;結果的高三十二位保存在EDX裏,低三十二位保存在EAX裏
;這裏所用的DWORD為一屬性操作符,在第四章會學到~~
(6MOV AX,DATAX
DIV 17H ;結果商保存在AL中,余數在AH中
(7MOV AX,DATAX
CDW
DIV DATAY
21。

NEG DX
NEG AX
SBB DX,0
22。

MOV AX,A ;把雙字長數的低字放到AX中
MOV DX,[A+2] ;把雙字長數的高字放到DX中
TEST DX,8000H ;測試雙字長數的符號
JZ RIGHT ;如果是非負數,則直接保存
NEG DX ;如果是負數,則求補
NEG AX
SBB DX,0
RIGHT: MOV B ,AX
MOV [B+2],DX
IBM-PC汇编语言程序设计(第二版课后习题答案(清华大学出版社(沈美明,温冬蝉著第三章答案23--382006-11-02 22:58 IBM-PC汇编语言程序设计(第二版课后习题答案
23。

每條指令單獨執行完後的結果依次為:
(1 9AH (261H (30FBH (41CH (50 (60E3H
24。

執行指令序列後,BX的內容為:0DAH
25。

(1把53D乘以2的程序:
MOV AX,35H ;53D=35H
SHL AX ,1
(2把53除以2 的程序:
MOV AX,35H
SHR AX,1
其他的同理~~
26。

這段程序完成的功能是:把DX:AX中的雙字數據左移4位(相當於乘以16D
27。

各條指令單獨執行後,DX的值依次為:
(1 5CH (217H (305C8H (472H (52017H (60CDH (70172H (805CCH
(90DCH
28。

該程序段執行完後,BX寄存器的內容是:C02DH
29。

(1从左到右把CONMAE中的字符串伟送到PRLINE的程序实现:
LEA SI,CONAME ;把CONAME中第一个字节的偏移地址送到SI中
LEA DI,PRLINE ;把PRLINE中第一个字节的偏移地址送到DI中
MOV CX,20 ;把重复次数放到CX里
CLD ;让SI DI从低地址指向高地址(即从左到右传送
REP MOVSB ;传送
(2从右到左把CONMAE中的字符串传送到PRLINE中的程序实现:
LEA SI ,CONAME
LEA DI,PRLINE
MOV CX,20
STD ;和上面唯一不同的就是这次是从右到左,所以要从高地址批向低地址
REP MOVSB
(3把CONAME中的第三和第四個字節裝入AX的程序實現:
LEA SI ,[CONAME+3]
LODSW
(4把AX寄存器的內容存入從PRLINE+5開始的字節中的程序實現:
LEA DI ,[PRLINE+5]
STOSW
(5檢查CONAME字符串中有無空格字符,如有把它偉送給BH寄存器的程序實現:
LEA DI,CONAME ;把CONAME中第一個字符偏移地址放入DI中
MOV CX,20 ;把重複次數放到CX中
MOV AL,20H ;把空格符的ASCII值放入AL中
CLD ;從低到高
REPNE SCASB ;比較
MOV BH,[DI-1]R ;把檢查到的空格符送到BH中
30。

MOV CX,12H ;把重複次數放到CX中。

這裏用十六進制表示
MOV SI,0 ;初始化SI
MOV AX,26H ;把&字符的ASCII值放入AX
CHECK: CMP AX,STRING[SI] ;依次查找
INC SI
LOOPNE CHECK ;找到了就退出
MOV AX,20H ;把空格符的ASCII值勤放入AX中
MOV STRING[SI-1],AX ;用空格符代替&
31。

(1用空格符清除PRINT_LINE域的程序实现:
MOV AL,20H
LEA DI ,PRINT_LINE
MOV CX,132
CLD
REP STOSB
(2在STUDENT_ADDR中查找第一个’_‘的程序实现:
MOV AX,2DH ;把“—”的ASCII值放入AX MOV SI,0 ;初始化SI MOV CX,9 ;把重複次數放入CX中
;依次檢查STUDENT-ADDR中的字符是否為"_",找到第一个停下来CHECK:CMP AX ,STUDENT_ADDR[SI] ;
INC SI
LOOPNZ CHECK
(3在STUDENT_ADDR中查找最后一个”_“的程序实现:
;和第二題不同的就是這次是從右到左查詢,所以SI的初始化為9
MOV AX,2DH
MOV SI ,9
MOV CX,9
CHECK :CMP AX,STUDENT_ADDR[SI]
DEC SI
LOOPNZ CHECK
(4程序實現:
MOV AL,2OH ;把空格符的ASCII值放入AL中
LEA DI ,STUDENT_NAME ;把STUDENT_NAME中第一个字符偏移地址放到DI中
MOV CX,30 ;把重复次数放到CX中
CLD ;让DI从低位移到高位
REPZ SCASB ;如果有不是空格符的,就退出
JZ STORE ;如果全是空格符,就转到STORE中
;用*代替空格
STORE:MOV AL 2AH
MOV CX ,30
STD ;注意,这里是把前面从低到高移动的DI再从高到低移上去~~ REP STOSB
(5程序实现:
;把STUDENT_NAME 移到PRINT_LINE的前30个字节中
LEA SI, STUDENT_NAME
LEA DI,PRINT_LINE
MOV CX ,30
CLD
REP MOVSB
;把STUDENT_ADDR移到PRINT_LINE的后9个字节中
LEA SI ,[STUDENT_ADDR+9] LEA DI,[PRINT_LINE+132] MOV CX,9 STD
REP MOVSB
32。

程序实现:。

LEA SI,OLDS
LEA DI,NEWS
MOV CX,5
REPZ CMPSB
JNZ NEW_LESS。

33。

(1CMP DX,CX
JA EXCEED (2CMP BX,AX JG EXCEED
(3CMP CX,0
JZ ZERO
(4CMP BX,AX
JO OVERFLOW (5CMP BX,AX JLE EQ_SMA (6 CMP DX,CX JBE EQ_CX
34。

(1跳转到:L1
(2跳转到L1
(3跳转到L2
(4跳转到L5
(5跳转到L5
35。

(1可以引起转移到L1的指令有: NB ,BE ,NL ,LE
(2可以引起转移到L1的指令有:同上
(3可以引起转移到L1的指令有: B,BE ,L , LE
(4可以引起转移到L1的指令有: NB ,NBE ,NL ,NLE
(5可以引起转移到L1的指令有:同上
(6可以引起转移到L1的指令有:同(3
(7可以引起转移到L1的指令有:同上
36。

37。

程序流程图就不画了,呵呵,程序如下~~
MOV AL,STAUS[SI] ;把要测试的字节放到AL中
AND AL,2AH ;把第一,三,五位为一其他位为0的数--2AH,与这个字节比较,结果
;放到AL中
JZ ROUTINE_4 ;如果结果为0,则三位都为0
XOR AL,2AH ;前面相与的结果再与2AH异或
JZ ROUTINE_1 ;如果结果为0,则三位都为1
BSF BL,AL ;
BSR BL ,AL
CMP BL,CL
;如果向前和向后测试后,第一个1 的位置相同,说明只有一个1,则异或运算前有AL中有两个1 JE ROUTINE_2
ROUTINE_1
注:本题还有其他解法,请大家自己试试~~
38。

(1当括号内是:LOOP时,循环四次,程序结束后
(AX=05 (BX= 16 (CX=0 (DX=0
(2当括号内是: LOOPE 时,不循环,程序结束后
(AX=02 (BX=04 (CX=03 (DX=02
(3当括号内是:LOOPNE 时:循环三次,程序结束后
(AX=04 (BX=11 (CX=01 (DX=0
IBM-PC汇编语言程序设计(第二版课后习题答案(清华大学出版社(沈美明,温冬蝉著第三章答案39--522006-11-02 23:02
39。

图,就不画了,呵呵~~自己看一下课本,P101~~
40.。

(10000 3100H (25100H (37100H
41。

(1目的地址:2004H 内容依次为: 56H F4H 23H 98H
(2目的地址: 384CH 内容依次为: 91H 34H F2H 01H
(3目的地址:寄存器,无物理地址~ 内容依次为:92H 6DH A2H 4CH 42。

(1PUSH AX
(SP<------(SP-2
(SP+1<-----(AH (SP<------(AL
(2POP ESI
(ESI<-------((ESP+3,(ESP+2,(ESP+1, (ESP
(ESP<-------(ESP+4
(3PUSH [BX]
(SP<------(SP-2
(SP+1<-----([BX+1] (SP<------([BX]
(4 PUSHAD
(ESP<-------(EAX
(ESP-4<-------(ECX
(ESP-8<-------(EDX
(ESP-12<-------(EBX
(ESP-16<-------(ESP ;这里指的是指令执行前的ESP (ESP-20<-------(EBP (ESP-24<-------(ESI
(ESP-28<-------(EDI
(ESP<-------(ESP-32
(5POP DS
(DS<------((SP+1,(SP
(SP<------(SP+2
(6 PUSH 4
(SP<-------(SP-2
(SP+1<-----0
(SP<------4
43。

(1 2CE FF93H (2 24B 76A0H
(3909 0804H (4 6F 13ADH
44。

(10FFFF FFFCH (20FFFF FFF8H
(30000 0007H (40000 0099H 45。

(EAX=0 (EBX=25d 46。

(AX=3d (DX=7d
47。

ADD ECX,EDX
ADD ECX,ESI
MOV EDI ,ECX
48。

IMUL BX,DX,100H执行的操作是:
(BX<-------(DX*100H
49。

程序实现:
MOV AL,BL
CBW
IDIV CL
IMUL 2
MOV DX,AX
50。

JMP DI 是直接跳转,执行的操作是:(IP<-----(IP+(DI
JMP [DI]是间接跳转,执行的操作是:(IP<----(IP+([DI]跳转到DI中所指向的内存单元中的指令地址~
51。

假设数组名为NUMBERS,程序如下~
MOV BX,0 ;后面用到~
MOV CX,100H ;把循环次数放入CX
MOV AL,42H
MOV SI,0 ;初始化SI
;CHECK 用来实现查找功能~
CHECK : CMP AL ,NUMBERS[SI]
INC SI
JB STORE1 ;大于42H的数的个数存入UP
JA STORE2 ;小于42H的的数的个数存入DOWN中~
LOOP CHECK ;相等继续循环~
STORE1 INC BL ;找到一个大于42 的数,BL值增加1~
MOV UP,BL
LOOP CHECK
STORE2 INC BH
MOV DOWN ,BH
LOOP CHECK
52。

图,也不用画了~~呵呵~好了,本章结束
########################################### ####################### IBM-PC汇编语言程序设计(第二版课后习题答案(清华大学出版社(沈美明,温冬蝉著第四章答案2006-11-04 21:591。

指令下列指令的错误
(1 MOV AH,BX 源操作数与目的操作数长度不相同~
(2 MOV [BX],[SI] 这是两个内存单元在传递数据,而这在汇编语言中是不允许的~~~
(3 MOV AX,[SI][DI] 不能用两个变址连用,其中一个应为基址~
(4 MOV MYDAT[BX][SI],ES:AX 同(2
(5 MOV BYTE PTR[BX],1000 必须有一个为寄存器
(6MOV BX,OFFSET MYDAT[SI] OFFSET 不能与复杂操作数相连~
(7MOV CS,AX 不能对CS赋值~
(8MOV ECX,AX 操作数类型不同~
2。

(1合法(2非法(3非法(4非法
3。

(1非法,操作数类型不同
(2合法
(3非法,不允许两个内存单元直接传递数据,你把人家CPU放哪了?~~~呵~
(4合法~
(5合法~
(6合法
(7非法~,必须有一个寄存器~~把CPU放哪了?~~ (8非法,两个内存单元地址相加没有意义~
(9合法
(10非法,同(3
4。

(1两内存单元传递数据
(2操作数类型不同
(3跳转指令只能跳转到符号地址
(4转移指令后不能为变量,只能为标号
(5格式不对,应为 NEAR PTR 。

5。

图,就不画了~~
6。

(1DW 5150H
(2MOV AX,5150H
MOV ADDRESS ,AX
等,写出几个就可以~~
7。

DATASG SEGMENT
FLD1B DB 'personal computer'
FLD2B DB 10 DUP (32
FLD3B DB 20H
FLD4B DB 01011001B
FLD5B DB '32654'
FLD6B DB 10 DUP (0
FLD7B DB 'PART1',DUP 20 (?,'PART2',DUP 50 (?,'PART3',DUP 14 (? FLD1W DW 0FFF0H
FLD2W DW 01011001B
FLD3W DW FLD7B
FLD4W DW 5,6,7,8,9
FLD5W DW 5 DUP (0
FLD6W DW (FLD6W-FLD1W-(FLD7B-FLD1B 8。

PLENTH 的值为22,GE表示该数据段的长度~
9。

L的值为7
10。

(1MOV AX,OFFSET LNAME
(2MOV SI,WORD PTR CODE_LIST
(3CODE_LENGHT EQU $-CODE_LIST 11。

代码如下:
DATA_SEG SEGMENT
DB 5
DATA_LIST DW 0FFFFH,0,2,5,4, 5 DUP (? DATA_SEG ENDS CODE_SEG SEGMENT
ASSUME CS:CODE_SEG,DS:DATA_SEG
MOV AX,5
MOV MAX,AX
MOV AX,0FFFFH
MOV MIN,AX
CODE_SEG ENDS
12。

(110025
(219
(32548
(43
(5103
(60FFFFH
(71
(83
13。

分别汇编成为:
MOV AX,0AH
MOV BL,0AH
MOV CL,1
14。

(1(AX=1 (2(AX=2 (3(CX=14H (4(DX=32H (5(CX=1] 15。

(1操作符错误改为: DATA_SEG SEGMENT
(2缺少段名在前面加个段名
(3引用应该从;开始把那个“/”改成“;”
(4结构混乱改为:
MAIN_PROC PROC FAR。

MAIN_PROC ENDP
END
16。

程序框架如下:
DATA_SEG SEGMENT ;定義數據段
ORG 0E000H ;讓下一字節地址為0E000H
FIRST_TYPE EQU THIS WORD ;建立一個與下一存儲單元有相同段地址和偏移地址的操作數
DATA_GROUP DB 100 DUP(? ;給DATA_GROUP 分配100個字節的空間
DATA_SEG ENDS ;數據段結束
STACK_SEG SEGMENT ;定義堆棧段
ALIGN 16 ;讓下一字節從小段首地址開始
STACK DB 100 DUP (? ;為堆棧分配空間
STACK_SEG ENDS ;
CODE_SEG SEGMENT
ASSUME CS:CODE_SEG ,DS:DATA_SEG ,SS:STACK_SEG ORG 1000H ;讓下條指令的第一個字節從1000H開始START : MOV AX,DATA_SEG
MOV DS,AX
MOV AX,STACK_SEG
MOV SS,AX
.......
CODE_SEG ENDS
END START ;結束~
17。

程序如下:
D_SEG SEGMENT ;数据段定义
AUGEND DD 99251
D_SEG ENDS
E_SEG SEGMENT ;附加段定义
ADDEND DD -15926
E_SEG ENDS
C_SEG SEGMENT ;代码段定义
ASSUME CS:C_SEG , DS:D_SEG,ES:E_SEG
START: MOV AX,D_SEG
MOV DS,AX
MOV AX,E_SEG
MOV ES,AX
MOV EAX,DS:AUGEND
ADD EAX,ES:ADDEND
MOV DS:SUM,EAX
C_SEG ENDS
END START ;结束
18。

19。

需要加上PTR伪操作的有:(2(3(4
IBM-PC汇编语言程序设计(第二版课后习题答案(清华大学出版社(沈美明,温冬蝉著第五章答案2006-11-04 22:01清华大学出版社,沈美明、温冬婵编著现在部分学校用的还是这本书,清华大学出版社,沈美明、温冬婵编著。

这当然不是标准答案,自己做的,呵呵,希望对大家有用处。

5.1 试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来
.model small
.stack 100H .code
main proc far Start:
push dx
mov ax,0 push ax
mov ah,01H int 21H
cmp al,61H
jl lop1
cmp al,7BH jge lop1
sub al,20H mov dl,al
lop1:mov ah,2 int 21H
ret
End start
5.2 编写一个程序,从键盘接受一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符.
.model small
.386
.code
MAIN PROC FAR
start:
push ds
sub ax,ax
push ax
input:
mov ah,7H
int 21H
cmpe:
cmp al,20H
JE exit
cmp al,61H
JL input
cmp al,7AH
JG input print:
sub al,01H mov dl,al mov ah,02H int 21H
add al,01H mov dl,al mov ah,02H int 21H
add al,01H mov dl,al mov ah,02H int 21H
;输出换行回车mov dl,0AH mov ah,02H int 21H
jmp input
exit :
ret
MAIN ENDP
END start
5.3 将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别放在AL、BL、CL、DL中。

.model small
.data
x DB 4 dup(?
.stack 100H
.code
MAIN PROC FAR
start:
push ds
and ax,00H
push ax
mov ax,1234H
mov cx,04H
mov si,00H
lop:
push cx
mov cl,04H
rol ax,cl
push ax
and al,0FH
mov BYTE PTR x[si],al pop ax
pop cx
add si,2
Loop lop
mov al,[X]
mov bl,[X+2]
mov cl,[X+4]
mov dl,[X+6]
print:
mov ah,02H
int 21H
mov dl,al
mov ah,02H
int 21H
mov dl,bl
int 21H
mov dl,cl
mov ah,02H
int 21H
exit:
ret
MAIN ENDP
END start
5.4 编写一个程序,要求比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示"MATCH",若不同在显示:"NO MATCH"。

.model small
.data
STRING1 DB 'I must study hard'
STRING2 DB 'I must study hard'
X DB 'MATCH .$'
Y DB 'NO MATCH.$'
.stack 100H
.code
main proc far
Start:
push dx
mov ax,0
push ax
mov ax,@data
mov ds,ax
mov es,ax
lea si,STRING1
lea di,STRING2
cld
mov cx,(string2-string1/ type STRING2
ret
End start
5.5编写一个程序,要求能从键盘接收一个个位数N,然后响铃N次,(响铃的ASCII为07。

这题比较有意思,呵呵。

model small
.code
main proc far start:
push ds push ax input:
mov ah,01H int 21H cmp al,20H je exit
cmp al,30H jle input cmp al,3AH jge input sub al,30H mov cx,ax and cx,0FFH lop:
mov dl,07H mov ah,2H
int 21H
loop lop
jmp input
exit :
ret
main endp
end start
5.6编写程序,将一个包含有20个数据的数组M分成两个数组:正数数组和负数数组N,并分别把这两个数组中的数据个数显示出来。

.model small
.386
.data
M DB 1,2,3,4,5,6,7,8,9,10,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10
P DB 20 dup(?
N DB 20 dup(?
.code
MAIN PROC FAR
start:
PUSH ds
AND ax,0
PUSH ax
MOV ax,@data
mov ds,ax
MOV bx,0
MOV si,0
MOV di,0
MOV cx,20D
cmpe :
CMP M[bx],0
JL ifLow
hight :
MOV al,byte ptr M[bx] MOV byte ptr P[si],al inc si
JMP commonContrl ifLow :
MOV al,byte ptr M[bx] MOV byte ptr N[di],al
INC di
commonContrl:
INC bx
loop cmpe
mov ax,si
call showNumber
call printCR
mov ax,di
call showNumber
exit: ret
MAIN ENDP
;;;;;;;;;;;;;;;;;注意,ShowNumber这个子过程有问题,请自行修改;;;;;;;;;;;;;;;; showNumber PROC NEAR
covernum:
DAA
MOV dx,ax
MOV cl,2H
show:
ROL dl,4H
push dx
AND dl,0fH
ADD dl,30H
MOV ah,02H
int 21H
pop dx
loop show
ret
showNumber ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; printCR PROC NEAR
mov dl,0aH
mov ah,02H
int 21H
mov dl,0dH
mov ah,02H
int 21H
ret
printCR ENDP
end start
5.7编制一个汇编语言程序,求出首地址为DATA的100D字数组中的最小偶数,并把它放在AX中。

此题根据题意要求应该使用完整汇编格式,因为精简格式也使用DATA....
dataare segment
DATA DW 3322H,4555H,200H,3544H,1245H
num DB ($-DATA/2
dataare ends
code segment
assume cs:code,ds:dataare
MAIN PROC FAR
start:
push ds
mov ax,0H
push ax
mov ax,dataare
mov ds,ax
mov dx,0H ;偶数数量计数
mov cx,Word ptr [num]
mov si,0H
isO:
mov bx,WORD PTR DATA[si] shr bx,1H
jnc addDX
jmp commonControl addDX:
ADD dx,1H
cmp dx,1H
je firstAXValue
compare:
mov bx,WORD PTR DATA[si] cmp bx,ax
jge commonControl
mov ax,bx commonControl:
ADD si,2H
loop isO
jmp exit
firstAXvalue:
mov ax,WORD PTR DATA[si]
jmp compare
exit:
ret
MAIN ENDP
code ends
END start
5.8没有做。

5.9编写一个汇编语言程序,要求从键盘上接收一个思维的十六位进制数,并在终端上显示与它等值的二进制数。

.model small
.386
.code
main proc far
start:
push ds
mov ax,0
push ax
mov ax,0
mov cx,4 mov dx,0 input: mov ah,1H int 21H cmp al,30H jl input cmp al,39H jle s
cmp al,61H jl input cmp al,66H jg input sub al,27H s:
sub al,30H add dl,al cmp cx,1H je f
rol dx,4
f:
loop input
exit:
call print
ret
main endp
print proc near
mov cx,10H
p:
rol dx,1
push dx
and dx,1 add dx,30H mov ah,2 int 21H pop dx loop p ret print endp end start 5.10设有一段英文,其变量字符名为ENG,并以$字符结束。

试编写一程序,查对单词SUN在该文中的出现次数,并以格式"SUN XXXX"显示出次数。

.model
small .386 .data ENG db 'SUN's SUN JAVA',24H ;;;;24H = $ MESSAGE db
'SUN:','$' .stack 100H .code MAIN PROC FAR start: PUSH DS AND AX,0 PUSH AX MOV AX,@data MOV DS,AX ;-----------------------MOV AX,0H MOV SI,1H subSI1: SUB SI,1H subSI2: SUB SI,1H compareS: ADD SI,1H MOV DL,ENG[SI] CMP
DL,24H JE print CMP DL,53H JNE compareS compareU: ADD SI,1H MOV
DL,ENG[SI] CMP DL,55H JNE subSI2 compareN: ADD SI,1H MOV DL,ENG[SI]
CMP DL,4EH JNE subSI1 INC AX JMP compares print: LEA DX,MESSAGE PUSH AX MOV AH,09H INT 21H POP AX call showNumber exit: ret MAIN
ENDP ;;;;;;;;;;;;;;;;;注意,ShowNumber这个子过程有问题,请自行修改;;;;;;;;;;;;;;;; showNumber PROC NEAR covernum: DAA MOV dx,ax MOV cl,4H show: ROL dx,4H push dx AND dx,0fH ADD dx,30H MOV ah,02H int 21H pop dx loop show ret showNumber ENDP END start 5.11从键盘输入一系列以$为结束副的字符串,然后
对其中的非数字字符计数,并显示出计数结果。

.model small .386 .code MAIN PROC FAR start: push ds mov ax,0 push ax mov cx,0 input: mov ah,1H int 21H compare: cmp al,24H
je print cmp al,30H jl addCount cmp al,39H jg addCount addCount: add ax,1H jmp input print: call showNumber exit: ret MAIN ENDP ;;;;;;;;;;;;;;;;;注意,ShowNumber这个子过程有问题,请自行修改;;;;;;;;;;;;;;;; showNumber PROC NEAR covernum: DAA MOV dx,ax MOV cl,2H show: ROL dl,4H push dx AND dl,0fH ADD dl,30H MOV ah,02H int 21H pop dx loop show ret showNumber ENDP END start 5.12 有一个首地址为MEM的100D字数组,试编制程序删除数组中所有为零的项,并将后续项向前压缩,最后将数组的剩余部分补上零。

.model small .386 .stack 100H .data mem dw 12,0,0,0,0,0,1,2,3,6,4,7,8,2,1,0,0,54,5,0,2,4,7,8,0,5,6,2,1,4,8,5,1,45,7,5,1,2,0,2,4,0 ,2,54,0, 12,0,0,0,0,0,1,2,3,6,4,7,8,2,1,0,0,54,5,0,2,4,7,8,0,5,6,2,1,4,8,5,1,45,7,5,1,2 ,0,2,4,0,2,54,0, 45,7,5,1,2,0,2,4,0,2 .code MAIN PROC FAR start: push ds and ax,0 push ax mov
ax,@data
mov ds,ax ;---------------------mov ax,0H mov bx,64H mov cx,64H mov si,0FFFEH repeat: ADD si,2H cmp MEM[si],0H JE calls loop repeat calls: INC ax call sort cmp ax,1H JE lastValue DEC cx jmp repeat exit : ret lastValue: mov mem[bx],0H DEC cx jmp repeat MAIN ENDP sort PROC NEAR push cx push si sub si,2H s: add si,2H mov dx,mem[si] mov mem[si+2],dx loop s return: pop si pop cx ret sort ENDP END start。

相关文档
最新文档