汇编语言答案
1.解答:有256个
2.解答:如下图.第一个络子为000B0H字单元,注意,是字单元,第五个格子为000B3H字单元
E5
1E
3C
2A
3.解答: 30022H字节单元内容: ABH 30024H字节单元内容: EFH
30021H字单元内容: AB34H 30022H字单元内容: CDABH 4.解答: 这三个物理地址都是3017AH,说明了不同的段地址和偏移地址对应同一物理地址
5.解答: CS+IP 第一个字的物理地址为: 0AAA40H
6.解答: 条件标志OF,SF,ZF,CF,的值依次为:0,0,0,0 7.下列操作可使用那些寄存器?
(1)加法和减法 AX,BX,CX,DX,当然,还有这几个通用寄存器的高低位了,如AH ,AL等
(2)循环计数 CX
(3)乘法和除法 DX,AX,AH,AL
(4)保存段地址 CS ,DS,ES,SS
(5)表示运算结果为O FLAGS
(6)将要执行的指令地址 IP
(7) 将要从堆栈取出数据的地址 BP,SP,SS
8.可以用来指示存储器地址的寄存器有: BX,SP,BP,DI,CS,DS,SI,ES,SS,IP
9.一一对应;
5--A 4--B 2--C 3--D 12--E 9--F 11--G 10--H 13--I 8--J 7--K 6---L 1--M 15--
N 14--O
1.(1)立即寻址 没有
(2)直接寻址 7237H
(3)使用BX的寄存器寻址 没有
(4)使用BX的间接寻址 637DH
(5)使用BX的寄存器相对寻址 0D5B4H
(6)基址变址寻址 8E18H
(7)相对基址变址 004FH
2.根据下列要求,写出相应的汇编指令。
(1)ADD 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)=78H,(2
1200)=2AH,(20201)=4CH,(21202)=B7H,(21203)=65H,试说明下列各条指令执行完后,AX寄
存器的内容。
(1)MOV AX,1200H 1200H
(2) MOV AX,BX 0100H
(3) MOV AX,[1200] 4C2AH 注意,是字单元!!
(4)MOV AX,[BX] 3412H 同上
(5)MOV 1100[BX] 4C2AH
(6) MOV AX,[BX][SI] 7856H
(7) MOV AX,1100[BX][SI] 65B7H
5.(1) 7CD9H (2) 0600H (3)098AH
6. MOV BX,2000H
LES DI ,[BX]
MOV AX, ES:DI
7.转向地址OBJ的值分别为:
(1)064DH (2)0691H (3)05E0H 注意有符号数的符号位
8. (1)MOV AX,0ABH 立即数寻址 无物理地址
(2)MOV AX,BX 寄存器寻址 同上
(3)MOV AX,[100] 直接寻址 20100H
(4)MOV AX,VAL 直接寻址 20050H
(5) MOV AX,[BX] 寄存器间接寻址 20100H
(6) MOV AX,ES:[BX] 直接寻址 21100H
(7) MOV AX,[BP] 寄存器间接寻址 20010H
(8)MOV AX,[SI] 同上 200A0H
(9) MOV AX,[BX+10] 寄存器相对寻址 20110H
(10)MOV 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) 4240H 0 0 1 0
(4) 0000H 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 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.
(1)MOV AX,DATAX
ADD DATAY,AX
(2)MOV AX,DATAX
ADD DATAY,AX
MOV AX,[DATAX+2]
ADD [DATAY+2] ,AX
(3)本組指令的作用是:BX <------[DATAX]+[DATAY]+[1](CF的值) 帶進位加法~
(4)MOV AX,DATAX
MUL DATAY ;結果的高十六位保存在DX裏,低十六位保存在AX裏 (5) MOV AX,DATAX
MOV DX,[DATAX+2]
MUL DWORD DATAY ;結果的高三十二位保存在EDX裏,低三十二位保存在EAX裏
(6)MOV AX,DATAX
DIV 17H ;結果商保存在AL中,余數在AH中 (7) MOV 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
23.每條指令單獨執行完後的結果依次為:
(1) 9AH (2)61H (3)0FBH (4)1CH (5)0 (6)0E3H 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(2)17H(3)05C8H(4)72H(5)2017H(6)0CDH(7)0172H(8)05CCH(9)0DCH
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.
(1)CMP DX,CX
JA EXCEED
(2)CMP BX,AX
JG EXCEED
(3)CMP CX,0
JZ ZERO
(4)CMP BX,AX
JO OVERFLOW
(5)CMP 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的指令有: 同上
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
39.P101
40.(1)0000 3100H (2)5100H (3)7100H 41.(1)目的地址:2004H 内容依次为: 56H F4H 23H 98H
(2)目的地址: 384CH 内容依次为: 91H 34H F2H 01H
(3)目的地址: 寄存器,无物理地址~ 内容依次为:92H 6DH A2H 4CH
42.(1)PUSH AX
(SP)<------(SP)-2
(SP+1)<-----(AH) (SP)<------(AL)
(2)POP ESI
(ESI)<-------((ESP)+3,(ESP)+2,(ESP)+1, (ESP))
(ESP)<-------(ESP)+4
(3)PUSH [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
(5)POP 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
(3)909 0804H (4) 6F 13ADH
44. (1)0FFFF FFFCH (2)0FFFF FFF8H
(3)0000 0007H (4)0000 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
1.指令下列指令的错误
(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 必须有一个为寄存器 (6)MOV BX,OFFSET MYDAT[SI] OFFSET 不能与复杂操作数相连
(7)MOV CS,AX 不能对CS赋值
(8)MOV ECX,AX 操作数类型不同
2.(1)合法 (2)非法 (3)非法 (4)非法 3.(1)非法,操作数类型不同
(2)合法
(3)非法,不允许两个内存单元直接传递数据
(4)合法
(5)合法
(6)合法
(7)非法,必须有一个寄存器
(8)非法,两个内存单元地址相加没有意义
(9)合法
(10)非法,同(3)
4.(1)两内存单元传递数据
(2)操作数类型不同
(3)跳转指令只能跳转到符号地址
(4)转移指令后不能为变量,只能为标号
(5)格式不对, 应为 NEAR PTR 6.(1)DW 5150H
(2)MOV 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.(1)MOV AX,OFFSET LNAME
(2)MOV SI,WORD PTR CODE_LIST
(3)CODE_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.(1)10025(2)19(3)2548(4)3(5)103(6)0FFFFH(7)1(8)3
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 ;结束
19.需要加上PTR伪操作的有: (2)(3)(4)
1.程序實現:(經DEBUG調試通過) code segment
main proc far
assume cs:code
start:
mov ah,1h
int 21h
sub al,20h
mov ah,2
mov dl,al
int 21h
main endp
code ends
end start
2.程序實現:(經DEBUG調試通過) code segment
assume cs:code
mov ah,1h
int 21h
sub al,1h
mov cl,3
again:
mov dl,al
mov ah,2
int 21h
inc al
loop again
code ends
end
3.程序實現:(經DEBUG調試通過) code segment
assume cs:code
mov ax,0f0feh
mov cl,4 ;把AX的最高四位
rol ax,cl ;移到最右面
and al,0fh ;再把AL的高四位清0
mov dl,al
rol ax,cl
and al,0fh
mov cl,al
rol ax,cl
and al,0fh
mov bl,al
rol ax,cl
and al,0fh
code ends
end
4.程序實現:(經DEBUG調試通過~~)
data segment
string1 db 20,0,20 dup (?)
string2 db 20,0,20 dup (?)
string3 db 'please input string1!','$'
string5 db 'match!','$'
string6 db 'nomatch!','$'
data ends
code segment
MAIN PROC FAR
assume cs:code, ds:data
start:
push ax ;保護現場
push bx
push cx
push dx
mov ax,data
mov ds,ax
mov dx,offset string3
call info ;在屏幕上輸出提示信息
mov dx,offset string1
call input ;在第一緩衝區輸入字符串
mov dx,offset string4
call info ;在屏幕上輸出提示信息
mov dx,offset string2
call input ;在第二緩衝區輸入字符串
call check ;比較兩個字符串
pop dx ;寄存器出棧
pop cx
pop bx
pop ax
main endp
;輸入字符串到緩衝區的過程
INPUT PROC NEAR
push ax
mov ah,0AH
int 21h
pop ax
ret INPUT ENDP
;在屏幕上輸出提示信息的過程
INFO PROC NEAR
push ax
mov ah,9
int 21h
call crlf ;回車換行
pop ax
ret
INFO ENDP
;回車換行 的過程
CRLF PROC NEAR
push dx
push ax
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
pop ax
pop dx
ret
CRLF ENDP
;比較兩字符串是否相同並且在屏幕上輸出相應信息的過程
CHECK PROC NEAR
push ax
push cx
push si
push di
mov ax,0
mov cx,0
mov cl,string1+1
mov si,2
mov di,2 re:
mov al,string1[di]
cmp al,string2[si]
jnz no
inc di
inc si
dec cx
jnz re
mov dx ,offset string5
call info
jmp exit
no:
mov dx,offset string6
call info
exit:
pop di
pop si
pop cx
pop ax
ret
CHECK ENDP
code ends
end start
5.程序實現:(經DEBUG調試通過) data segment
info1 db 'PLEASE INPUT A NUMBER','$' ;提示信息,下同
info2 db 'WRONG NUMBER! PLEASE INPUT ANOTHER NUMBER!','$' ;如果鍵入非數字
值,報錯,並提示輸入新的數字 data
ends
code segment
MAIN PROC FAR
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov dx,offset info1
call info ;提示輸入一個數字
call input ;輸入過程
call check ;檢查是否非數字字符
call bell ;響鈴N次,N為鍵入數字
ret
MAIN ENDP
;在屏幕上輸出提示信息的過程 INFO PROC NEAR
push ax
mov ah,9h
int 21h
call crlf
pop ax
ret
INFO ENDP
;回車換行的過程 CRLF PROC NEAR
push ax
push dx
mov dl,0dh
mov ah,2h
int 21h
mov dl,0ah
mov ah,2h
int 21h
pop dx
pop ax
ret
CRLF ENDP
;輸入的過程
INPUT PROC NEAR
mov ah,1
int 21h
ret
INPUT ENDP
;檢查是否非數字字符的過程~
CHECK PROC NEAR
push dx
cmp al,30h ;如果鍵入的字符ASCII值小於0的ASCII值30H,
jb WRONG ;剛轉入WRONG,作錯誤處理
cmp al,39h ;如果鍵入的字符ASCII值大於9的ASCII值39H,
ja WRONG ;則轉入WRONG,作錯誤處理
mov cl,al ;把合法的數字ASCII值放入CL中
jmp next
;錯誤處理過程,提示,並等待用戶鍵入新值
WRONG:
mov dx,offset info2
call info
call input
call check
next:
pop dx
ret
CHECK ENDP
;根據用戶鍵入的數字,響鈴相應的次數
BELL PROC NEAR
push dx
sub cl,30h ;鍵入數字的ASCII值減去30,才能成為次數
mov dl,7h
mov ah,2
re:
int 21h
dec cx
jnz re
pop dx
ret
BELL ENDP
CODE ENDS
END START
6.程序實現。(末经调试)
.model small
.data
m db dup (20個數)
n db 20,0,20 dup (?) ;用于存放负数的最大容量为20的数组
p db 20,0,20 dup (?) ;同上,用于存放正数 .code
main proc far
start:
mov ax,@data
mov ds,ax
call check_store ;判斷數的正負並存入相應數組
call display ;在屏幕上顯示 main endp
check_store proc near
push ax
push bx
push cx
mov cx,20 ;循環次數放入CX
cld ;使SI向增加的方向移動
lea si,m ;M的偏移地址放入SI again:
mov al,[si] ;M中的數依次放入AL中
cmp al,0 ;並且依次和0比較
jl store_in_n ;如果小於0,則存入負數組
jg store_in_p ;如果大於0,剛存入正數組
dec cx
jnz again
jz exit
store_in_n :
push bx
mov bl,n[1] ;N中已有數的個數放入BL中,
mov n[bl+1],al ;把AL中負數存入數組N的最後一個數字的下一字節
pop bx
jmp again
store_in_p
STORE—IN—P
push bx
mov bl,p[1]
mov p[bl+1],al
pop bx
jmp again
exit:
pop cx
pop bx
pop ax
ret
check_store endp
display proc near
push cx
lea si,n[2]
mov cl,n[1] ;數組N中數的個數放入CL
cld
mov ah 2
re_display_n: ;依次顯示各個負數
mov dl,[si]
int 21h
mov dl,20h ;各個數之間用空格間隔
int 21h
dec cl
jnz re_display_n
;下面四行用來回車和換行
mov dl,0dh
int 21h
mov dl,0ah
int 21h
;同上面負數的顯示,
lea si,p[2]
mov ch,p[1]
cld
re_display_p:
mov dl,[si]
int 21h
mov dl,20h
int 21h
dec ch
jnz re_display_p
pop cx
ret
display endp
end start
7.程序實現。(未調試)
.model small
.data
data db 100d dup (100個數). .code
start:
mov ax,@data
mov ds,ax
mov cx,101d ;循環次數
mov bl,0feh ;初始化BX為最大的八位無符號正數
mov si,offset data
cld
again:
dec cx
jz finish ;全部判斷完成
mov al,[si]
cbw
div 2 ;每個數除以2
cmp al,0 ;佘數不為0的,不是偶數
jne again
cmp bl,[si] ;每次比較,
jl again ;較小的數,
mov bl,[si] ;代替BX中原來的數
jmp again
finish:
mov ax,0
mov al,bl ;把最小偶數放到AX中 end start
8.程序實現。(未調試)
.model samll
.code
start:
mov ch,9 ;比較次數放入CH
mov cl,2 ;每次AX循左移的次數放入CL
mov dl,0 ;初始化DL,DL,中存放“四分之一字節”為三的個數
again:
dec ch ;如果AX最後兩個字節循環結束,
jz display ;則在屏幕上輸出為“3”的個數
rol ax,cl
mov bl,al
and bl,3
cmp bl,3 ;如果“四分之一字節”不為3,
jnz again ;則判斷下一個“四分之一字節”
inc dl ;否則,DL增加一
jmp again
display: ;在屏幕上輸出DL內容
mov ah,2
int 21h
end start
9.程序實現:
.model small
.data
info1 db ' PLEASE INPUT A NUMBER!',0DH,0AH,'$' ;提示信息,下同
info2 db 'ILLEGAL CHAR,PLEASE TYPE IT AGAIN!',0DH,0AH,'$'
.code
main proc far
start:
PUSH ax
push bx
push cx
push dx
mov ax,@data
mov ds,ax
mov dx,offset info1
call dis_str ;在屏幕上顯示提示信息
call input_num ;輸入十六進制數
call dis_num ;在屏幕上輸出二進制數
pop dx
pop cx
pop bx
pop ax
RET
main endp
;在屏幕上顯示提示信息的過程
dis_str proc near
push ax
mov ah,9
int 21h
pop ax
ret
dis_str endp
;輸入一個四位十六進制數,並保存在BX中的過程
input_num proc near
push ax
push cx
mov bx,0 ;初始化BX
mov ch,4 ;循環次數(十六進制數的位數!)
new_char:
mov ah,1
int 21h
sub al,30h ;把ASCII值轉換成為二進制數
cmp al,0 ;和0相比,
jl wrong ;如果比0小,說明不是數字,,,轉往非法字符處理過程,
cmp al,9 ;是否A--F?
jle add_to ;如果是0--9,直接放入BX中
sub al,7 ;如果是A--F,減去7,
cmp al,16 ;再和16D(10H)相比,
jg wrong ;如果大於16D,說明不是數字,轉入非法字符處理過程
add_to:
mov cl,4 ;BX每次左移四位
shl bx,cl
mov ah,0
add bx,ax
dec ch
jz exit
jmp new_char ;輸入新的數字 wrong:
push dx
mov dx,offset info2
call dis_str
pop dx
jmp new_char
exit:
pop cx
pop ax
ret
input_num endp
;在屏幕上輸出二進進制數的過程 dis_num proc near
mov cx,16
mov ah,2
re:
rol bx,1
mov dl,bl
and dl,1
add dl,30h
int 21h
dec cx
jnz re
ret
dis_num endp
end start
10.程序實現,(DEBUG調試通過) .model samll
.data
eng db 'hello,sun.how are? hi,are you sun? sun is a beutifull girl! su
nun$' ;用作測試的字符串,共有三個SUN
info db'sun','$'
.code
main proc far
start:
mov ax,@data
mov ds,ax
mov cx,0 ;初始化CX
mov di,0
again:
mov al,24h ;24H,字符串結束標誌$的ASCII值
cmp al,eng[di] ;檢查當前字符是否是‘$'
jz exit ;如果是結束標誌,就退出~~
mov al,73h ;73H,字母s的ASCII值
cmp al,eng[di] ;檢查當前字符是否是's',下同
jnz next1
inc di
mov al,75h ;75H,字母U(小寫)的ASCII值,
cmp al,eng[di]
jnz next2
inc di
mov al,6eh
cmp al,eng[di]
jnz next2
inc cl ;SUN單詞的個數放進CX中
next1:
inc di
next2:
jmp again ;繼續第一步~
exit:
mov dx,offset info
mov ah,9
int 21h
mov dl,cl ;把CL中SUN的個數顯示出來
add dl,30h
mov ah,2
int 21h
ret
main endp
end start
11.程序實現;(未調試)
.model samll
.data
str db 255,0,255 dup (?) ;定義一最大值為255字節的字符緩衝區用於存入輸
入的字符
info1 db 'PLEASE INPUT SOME CHARS,END WITH "$"!','0DH','0AH','$'
info2 db 'THE NUMBER OF THE CHARS WHICH ARE NOT NUMBERS IS :$'
.code
main proc near
start:
mov ax,@data
mov ds,ax
mov bx,0
mov dx,offset info1
mov ah,9
int 21h ;提示信息
mov dx,offset str
mov ah,0ah
int 21h ;輸入字符到定義的緩衝區
mov si,2 ;初始化SI
again:
mov al,str[si] ;
cmp al,24h ;如果是字符串結束標誌$就退出~
jz exit
cmp al,30h ;如果小於30H,(0的ASCii值),就是非數字字符
jl yes
cmp al,39h ;如果大於39H, (9的ASCii值),也是非數字字符
jg yes
inc si ;使SI指向下一字符,
jmp again
yes:
inc si
inc bl ;用BL記錄非數字字符的個數
jmp again
exit:
mov ah,9
mov dx,offset info2
int 21h ;提示信息
mov cl,100 ;以下為把BL中非數字字符的個數轉換成為十進制,並在屏幕上顯示的過程
call div_dis
mov cl,10
call div_dis
mov cl,1
call div_dis
ret
main endp
div_dis proc near
mov al,bl
cbw
div cl
mov bl,ah
mov dl,al
add dl,30h ;把二進制轉換成字符
mov ah,2
int 21h
ret
div_dis endp
end start