《2022年重要的汇编程序 .pdf》由会员分享,可在线阅读,更多相关《2022年重要的汇编程序 .pdf(8页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、5.3 将 AX 寄存器中的16 位数分成4 组,每组4 位,然后把这四组数分别放在AL 、BL 、CL 和 DL 中。DSEG SEGMENT STORE DB 4 DUP (?) DSEG ENDS BEGIN: MOV CL, 4 ;右移四次MOV CH, 4 ;循环四次LEA BX, STORE A10: MOV DX, AX AND DX, 0FH ;取 AX 的低四位MOV BX, DL ;低四位存入STORE 中INC BX SHR AX, CL ;右移四次DEC CH JNZ A10 ;循环四次完了码?B10: MOV DL, STORE ;四组数分别放在AL 、BL 、CL
2、和 DL 中MOV CL, STORE+1 MOV BL, STORE+2 MOV AL, STORE+3 STOP: RET 5.4 试编写一程序, 要求比较两个字符串STRING1 和 STRING2 所含字符是否完全相同,若相同则显示 ,MA TCH?, 若不相同则显示,NO MA TCH?。DSEG SEGMENT STRING1 DB ,I am a student.?STRING2 DB ,I am a student!?YES D B ,MATCH?, 0DH, 0AH, ,$?NO DB ,NO MATCH?, 0DH, 0AH, ,$?DSEG ENDS CSEG SEGME
3、NT MAIN PROC FAR ASSUME CS: CSEG , DS: DSEG, ES: DSEG START: PUSH DS ;设置返回DOS SUB AX, AX PUSH AX MOV AX, DSEG MOV DS, AX ;给 DS 赋值MOV ES, AX ;给 ES 赋值BEGIN: LEA SI, STRING1 ;设置串比较指令的初值LEA DI, STRING2 CLD MOV CX, STRING2 - STRING1 REPE CMPSB ;串比较JNE DISPNO LEA DX, YES ;显示 MA TCH 名师资料总结 - - -精品资料欢迎下载 -
4、- - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 8 页 - - - - - - - - - JMP DISPLAY DISPNO: LEA DX, NO ;显示 NO MATCH DISPLAY: MOV AH, 9 ;显示一个字符串的DOS 调用INT 21H RET MAIN ENDP CSEG ENDS ;以上定义代码段END START 5.10 设有一段英文, 其字符变量名为ENG,并以 $字符结束。 试编写一程序, 查对单词 SUN在该文中的出现次数,并以格式“SUN :xxxx” 显示出次数。DSEG
5、SEGMENT ENG DB ,Here is sun, sun , ,$?DISP DB ,SUN :?DAT DB ,0000? , 0DH, 0AH, ,$?KEYWORD DB ,sun?DSEG ENDS CSEG SEGMENT MAIN PROC FAR ASSUME CS: CSEG , DS: DSEG, ES: DSEG START: PUSH DS ;设置返回DOS SUB AX, AX PUSH AX MOV AX, DSEG MOV DS, AX ;给 DS 赋值MOV ES, AX ;给 ES 赋值BEGIN: MOV AX, 0 MOV DX, DISP-ENG-
6、2 ;计算 ENG 的长度 (每次比较sun,因此比较次数-2) LEA BX, ENG COMP: MOV DI, BX LEA SI, KEYWORD MOV CX, 3 REPE CMPSB ;串比较JNZ NOMATCH INC AX ;是, SUN 的个数加1 ADD BX, 2 NOMA TCH: INC BX ;指向 ENG 的下一个字母DEC DX JNZ COMP DONE: MOV CH, 4 ;将次数转换为16 进制数的ASCII 码MOV CL, 4 LEA BX, DAT ;转换结果存入DAT 单元中DONE1: ROL AX, CL MOV DX, AX AND D
7、L, 0FH ;取一位16 进制数名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 8 页 - - - - - - - - - ADD DL, 30H CMP DL, 39H JLE STORE ADD DL, 07H ;是 “AF” 所以要加7 STORE: MOV BX, DL ;转换结果存入DAT 单元中INC BX DEC CH JNZ DONE1 DISPLAY: LEA DX, DISP ;显示字符串程序(将 DISP 和 DAT 一起显示 ) MOV AH,
8、09H INT 21H RET MAIN ENDP CSEG ENDS ;以上定义代码段END START 5.17 试编制一个程序把AX 中的 16 进制数转换为ASCII 码,并将对应的ASCII 码依次存放到 MEM 数组中的四个字节中。例如,当(AX)=2A49H时,程序执行完后,MEM 中的 4 个字节内容为39H,34H, 41H,32H。DSEG SEGMENT MEM DB 4 DUP (?) N DW 2A49H DSEG ENDS CSEG SEGMENT MAIN PROC FAR ASSUME CS: CSEG , DS: DSEG START: PUSH DS ;设置
9、返回DOS SUB AX, AX PUSH AX MOV AX, DSEG MOV DS, AX ;给 DS 赋值BEGIN: MOV CH, 4 ;循环计数器MOV CL, 4 MOV AX, N LEA BX, MEM ROTATE: MOV DL, AL ;从最低四位开始转换为ASCII 码AND DL, 0FH ADD DL, 30H CMP DL, 3AH ;是 09 吗?JL NEXT ADD DL, 07H ;是 AF NEXT: MOV BX, DL ;转换的ASCII 码送入 MEM 中INC BX ROR AX, CL ;准备转换下一位DEC CH 名师资料总结 - - -
10、精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 8 页 - - - - - - - - - JNZ ROTATE RET MAIN ENDP CSEG ENDS ;以上定义代码段END START 5.23 已定义了两个整数变量A 和 B,试编写程序完成下列功能:(1) 若两个数中有一个是奇数,则将奇数存入A 中,偶数存入B 中;(2) 若两个数中均为奇数,则将两数加1 后存回原变量;(3) 若两个数中均为偶数,则两个变量均不改变。DSEG SEGMENT A DW ?B DW ?DSEG EN
11、DS CSEG SEGMENT MAIN PROC FAR ASSUME CS: CSEG , DS: DSEG START: PUSH DS ;设置返回DOS SUB AX, AX PUSH AX MOV AX, DSEG MOV DS, AX ;给 DS 赋值BEGIN: MOV AX, A MOV BX, B XOR AX, BX TEST AX, 0001H ;A 和 B 同为奇数或偶数吗?JZ CLASS ;A 和 B 都为奇数或偶数,转走TEST BX, 0001H JZ EXIT ;B 为偶数,转走XCHG BX, A ;A 为偶数,将奇数存入A 中MOV B, BX ;将偶数存
12、入B 中JMP EXIT CLASS: TEST BX, 0001H ;A 和 B 都为奇数吗?JZ EXIT ;A 和 B 同为偶数,转走INC B INC A EXIT: RET MAIN ENDP CSEG ENDS ;以上定义代码段END START 6.7 设有 10 个学生的成绩分别是76,69,84,90,73,88,99,63,100 和 80 分。试编制一个子程序统计6069 分,7079 分,8089 分,9099 分和 100 分的人数, 分别存放到S6,S7, S8,S9 和 S10 单元中。DSEG SEGMENT 名师资料总结 - - -精品资料欢迎下载 - - -
13、 - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 8 页 - - - - - - - - - RECORD DW 76 ,69,84,90,73,88,99,63,100,80 S6 DW 0 S7 DW 0 S8 DW 0 S9 DW 0 S10 DW 0 DSEG ENDS CSEG SEGMENT MAIN PROC FAR ASSUME CS: CSEG , DS: DSEG START: PUSH DS ;设置返回DOS SUB AX, AX PUSH AX MOV AX, DSEG MOV DS, AX ;给 D
14、S 赋值BEGIN: MOV CX, 10 CALL COUNT RET MAIN ENDP COUNT PROC NEAR ;成绩统计子程序MOV SI, 0 NEXT: MOV AX, RECORDSI MOV BX, 10 ;以下 5 句是根据成绩计算相对S6 的地址变化量DIV BL ;计算公式为:(成绩 )/10-6)*2 送(BX) MOV BL, AL ;此时 (BH) 保持为 0 不变SUB BX, 6 ;应为只统计60 分以上成绩SAL BX, 1 ;(BX)*2 INC S6BX ;S6 是 S6,S7, S8,S9和 S10 单元的首地址ADD SI, 2 LOOP NE
15、XT RET COUNT ENDP ;COUNT 子程序结束CSEG ENDS ;以上定义代码段END START 6.15 试编写一个执行以下计算的子程序COMPUTE :R X + Y - 3 其中 X, Y 及 R均为字数组。 假设 COMPUTE 与其调用程序都在同一代码段中,数据段 D_SEG中包含 X 和 Y 数组,数据段E_SEG 中包含 R 数组,同时写出主程序调用COMPUTE 过程的部分。如果主程序和COMPUTE 在同一程序模块中,但不在同一代码段中,程序应如何修改?如果主程序和COMPUTE 不在同一程序模块中,程序应如何修改?答: (1) 主程序和 COMPUTE 在
16、同一代码段中的程序如下:TITLE ADDITION ;主程序D_SEG SEGMENT PARA ,DA TA?名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 8 页 - - - - - - - - - COUNT EQU 10H X DW COUNT DUP (?) Y DW COUNT DUP (?) D_SEG ENDS E_SEG SEGMENT PARA ,DA TA?R DW COUNT DUP (?) E_SEG ENDS C_SEG SEGMENT PA
17、RA ,CODE?ADDITION PROC FAR ASSUME CS: C_SEG, DS: D_SEG, ES: E_SEG START: PUSH DS SUB AX, AX PUSH AX MOV AX, D_SEG MOV DS, AX MOV AX, E_SEG MOV ES, AX CALL COMPUTE ;调用求和子程序RET ADDITION ENDP COMPUTE PROC NEAR ;同一段的求和子程序MOV CX, COUNT MOV BX, 0 REPEAT: MOV AX, XBX ADD AX, YBX SUB AX, 3 MOV ES: RBX, AX R
18、ET COMPUTE ENDP C_SEG ENDS END START (2) 主程序和COMPUTE 在同一程序模块中,但不在同一代码段中的程序如下:TITLE ADDITION ;主程序D_SEG SEGMENT PARA ,DA TA?COUNT EQU 10H X DW COUNT DUP (?) Y DW COUNT DUP (?) D_SEG ENDS E_SEG SEGMENT PARA ,DA TA?R DW COUNT DUP (?) E_SEG ENDS C_SEG SEGMENT PARA ,CODE?ADDITION PROC FAR ASSUME CS: C_SEG
19、, DS: D_SEG, ES: E_SEG 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 8 页 - - - - - - - - - START: PUSH DS SUB AX, AX POP AX MOV AX, D_SEG MOV DS, AX MOV AX, E_SEG MOV ES, AX CALL FAR PTR COMPUTE ;调用求和子程序RET ADDITION ENDP C_SEG ENDS CODESG SEGMENT PARA ,CODE?AS
20、SUME CS: CODESG COMPUTE PROC FAR ;不同段的求和子程序MOV CX, COUNT MOV BX, 0 REPEAT: MOV AX, XBX ADD AX, YBX SUB AX, 3 MOV ES: RBX, AX RET COMPUTE ENDP CODESG ENDS END START (3) 主程序和COMPUTE 不在同一程序模块中的程序如下:TITLE ADDITION ;主程序EXTRN COMPUTE: FAR PUBLIC COUNT, X, Y , R D_SEG SEGMENT PARA ,DA TA?COUNT DW 10H X DW
21、10H DUP (?) Y DW 10H DUP (?) D_SEG ENDS E_SEG SEGMENT PARA ,DA TA?R DW 10H DUP (?) E_SEG ENDS C_SEG SEGMENT PARA ,CODE?ADDITION PROC FAR ASSUME CS: C_SEG, DS: D_SEG, ES: E_SEG START: PUSH DS SUB AX, AX POP AX MOV AX, D_SEG MOV DS, AX 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 -
22、- - - - - - 第 7 页,共 8 页 - - - - - - - - - MOV AX, E_SEG MOV ES, AX CALL FAR PTR COMPUTE ;调用求和子程序RET ADDITION ENDP C_SEG ENDS END START TITLE COMPUTE ;求和子程序EXTRN COUNT:WORD, X:WORD, Y:WORD, R:WORD PUBLIC COMPUTE CODESG SEGMENT PARA ,CODE?ASSUME CS: CODESG COMPUTE PROC FAR ;不同模块的求和子程序MOV CX, COUNT MOV
23、 BX, 0 REPEAT: MOV AX, XBX ADD AX, YBX SUB AX, 3 MOV ES: RBX, AX RET COMPUTE ENDP CODESG ENDS END 8.10 假定中断类型9H 的中断处理程序的首地址为INT_ROUT ,试写出主程序中为建立这一中断向量而编制的程序段。MOV AL, 1CH ;取原中断向量,并保护起来MOV AH, 35H INT 21H PUSH ES PUSH BX PUSH DS MOV AX, SEG INT_ROUT MOV DS, AX MOV DX, OFFSET INT_ROUT MOV AL, 09H MOV AH, 25H ;设置中断向量功能调用INT 21H POP DS POP DX ;还原原中断向量POP DS MOV AL, 1CH MOV AH, 25H INT 21H 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 8 页 - - - - - - - - -
限制150内