汇编语言复习(三)课堂实验回顾

1、汇编语言的源代码格式

data segment                       ;定义数据段
  x dw 0123h,0456h
  y dw 0789h,0abch
  z dw 0defh,0fedh
  w dw 0cbah,0987h
data ends


stack segment  stack                    ;定义堆栈段
  dw 0,0,0,0,0,0,0,0,0,0,0
stack ends


code segment
assume cs:code,ds:data,ss:stack    ;对数据段、堆栈段、代码段进行声明
start:mov ax,data 
      mov ds,ax                    ;让ds寄存器指向data段

      mov ax,stack
      mov ss,ax                    ;让ss寄存器指向stack段
      mov sp,20h                   ;设置栈顶SS:SP指向stack:20
 
      mov bx,0                     ;ds:bx指向data段中的第一个单元

;--------------------------------------------------------------
;根据要求编写代码开始  

      mov  cx,8
   s: push [bx]
      add  bx,2
      loop  s                      ;以上将data段中的0~15单元中的8个字型数据依次入栈
      
      mov  bx,0

      mov  cx,8
  s0: pop [bx]
      add bx,2
      loop s0                      ;以上依次出栈8个字型数据到data段中的0~15单元中

;根据要求编写代码结束
;-------------------------------------------------------------

      mov  ax,4c00h                ;AH=4ch
      int  21h                     ;dos中断调用( int 21h )--返回 

code   ends
end   start
                               

2、根据字节中位的不同跳转至不同处理程序的例题

要求测试在STATUS中的一个字节,如果第1、3、5位均为1则转移到ROUTINE_1;如果此三位中有两位为1则转移到ROUTINE_2;如果此三位中只有一位为1则转移到ROUTINE_3;如果此三位全为0则转移到ROUTINE_4。试画出流程图,并编制相应的程序段。
答:程序段如下:
MOV AL, STATUS
AND AL, 00010101B ;只保留第1、3、5位
JZ ROUTINE_4 ;3位全为0转ROUTINE_4
JPE ROUTINE_2 ;两位为1转ROUTINE_2
CMP AL, 00010101B
JZ ROUTINE_1 ;3位全为1转ROUTINE_1
ROUTINE_3: ┇ ;仅一位为1执行ROUTINE_3
JMP EXIT
ROUTINE_1: ┇
JMP EXIT
ROUTINE_2: ┇
JMP EXIT
ROUTINE_4: ┇
EXIT: INT 20H

3、累加和程序题

编写 100+98+…..+2 的累加和程序并调试通过,并记录程序执行结束后CX的值是多少?

DATA SEGMENT
    SRC DW 64H
DATA ENDS

CODE SEGMENT
    ASSUME DS:DATA, CS:CODE
START:    MOV AX,DATA
         MOV DS, AX                           ;DS指向DATA
                  MOV BX, OFFSET SRC
    MOV AX, [BX]                       ;初始化AX,CX
    MOV CX,0064H
    MOV DX,0
LOP:     ADD DX,AX                           ;每减二就
    SUB AX,2                    ;加到DX,DX中存放最终结果
    LOOPNZ LOP                         ;当ax减为零时结束循环
                 MOV AX,4C00H
                 INT 21H

CODE ENDS
END START



4、字符串的复制与查找

  1. 把从LIST LIST+316中的字符串传送到BLKBLK+316 中去;
  2. BLKBLK+100中查找字符“CQU”字符串,并记下“CQU”字符串出现的起始位置到BX中。

说明,LIST LIST+100的内容(fromhttp://study.cqu.edu.cn/IndexOfEnglish/Index)为:

Chongqing University (CQU) is a key national university and a member of the “Excellence League”, located in Chongqing, Southwest China. It is also one of the “211 Project" and "985 Project” universities with full support in construction and development from the central government and Chongqing Municipal Government.

DATA SEGMENT
    LIST DB 'Chongqing University (CQU) is a key national university and a member of '
                         DB ' one of the “211 Project" and "985 Project” universities with full support in'
                         DB ' construction and development from the central government and Chongqing'
                        DB 'Municipal Government.$'

DATA ENDS

EXTRA SEGMENT
    BLK DB 316 DUP(?)
EXTRA ENDS

CODE SEGMENT
    ASSUME CS:CODE, DS:DATA, ES:EXTRA
START:MOV AX,DATA
    MOV DS,AX
                  MOV AX,EXTRA
                  MOV ES,AX 
    MOV CX,316       ;设置复制的循环次数
     LEA SI,LIST
    LEA DI,BLK
    CLD
      REP MOVSB          ;复制完毕
    
    MOV CX,100        ;设置查找的次数
    LEA DI,BLK
    MOV AL,'C'
    MOV AH,'Q'
    MOV DL,'U'
LOP:    CLD
    REPNE SCASB       ;查找与'C'匹配
    JZ MATCHC          ;若匹配则跳转到检查‘Q’

MATCHC:   CMP BLK[DI],AH ;检查下一个是否为'Q'
    JZ MATCHQ         ;是,则跳转到检查'U'
    JNZ LOP               ;否,则继续检查下一个‘C'

MATCHQ:  INC DI                  ;下下一个是否为'U'
     CMP BLK[DI],DL
     JZ MATCH           ;是,则结束检测,记录位置
     JNZ LOP               ;否,则继续检查下一个‘C'


MATCH:    DEC DI                  
    DEC DI                 ;由于DI增加两次,所以起始位置需要减小两次
    MOV BX, DI

    MOV AX,4C00H
    INT 21H

CODE ENDS
END START
                                               

4、起泡排序例题

  1. 在缓冲区中输入20字符,然后按ASCII值从大到小的顺序排列并显示出来。

要求:

(1)显示时每个字符间隔一个空格;

(2)换行后再将其中的数字按序显示出来。

datarea segment
    buffer dw 20 dup(?)
    tip db 'A 20-length string:','$'   ;提示字符,提示用户输入
datarea ends

program segment
    assume cs:program,ds:datarea
start:
;set DS register to current data segment
    mov ax,datarea
    mov ds,ax

    mov dx,offset tip     ;将串的段内地址装入DX
          mov ah,09h              ;在屏幕上输出提示用户输入的字符
    int 21h
     ;输入字符
    lea bx,buffer
    mov cx,20               ;输入字符限定为20
input:    mov ah,01              ;此处开始循环输入字符
    int 21h
    mov [bx],al
    add bx,2
    loop input

            ;起泡排序,由大到小
           mov cx,20
    dec cx
loop1:    mov di,cx   ;外层循环
    mov bx,0
loop2:    mov al,buffer[bx]    ;内层循环
    cmp al,buffer[bx+2]  
    jge continue              ;如果前一个大于等于后一个,则不交换
    xchg ax,buffer[bx+2]
    mov buffer[bx],ax
continue:    add bx,2
    loop loop2
    mov cx,di
    loop loop1
    
    ;换行以便输出排序后的字符串
    mov dl,0dh
    mov ah,02h
    int 21h
    mov dl,0ah
    mov ah,2
    int 21h

    ;输出排序后的字符串
    mov cx,14h               ;字符串长度为20
    mov bx,0                  ;buffer的索引
print:    mov dl,byte ptr buffer[bx]
    mov ah,02h              ;将相应字符输出到屏幕上
    int 21h
    mov dl,20h               ;输入空格
    mov ah,02h
    int 21h
    add bx,2                    ;索引更新到下一个
    loop print

    ;换行以便输出字符串中的数字
    mov dl,0dh
    mov ah,02h
    int 21h
    mov dl,0ah
    mov ah,2
    int 21h

    ;输出字符串中的数字
    mov cx,14h
    sub bx,bx              ;更新索引至0,为字符串开头
num:    mov ax,buffer[bx]
    sub ax,30h   ;数字的asc2码介于30h--39h
    js next          ;该字符的码值若小于30h,则跳转
    sub ax,09h   ;字符为数字
    jns next        ;字符不为数字则跳转
    mov dl,byte ptr buffer[bx]    ;输出数字
    mov ah,02h
    int 21h
next:         add bx,2
    loop num

    mov ax,4c00h
    int 21h
program ends
end start              

5、双重循环比较两整数数组之间的内容并输出不同的整数

已知数组A包含15个互不相等的整数,数组B包含10个互不相等的整数。试编制一程序,把既在A中又在B中出现的整数存放于数组C中。然后将数组C逐个显示出来。

;***********************************************
datarea segment
    A dW 0020h,0030h,0040H,0050H,0060H,0070H,0080H,0090H,0010H,0230H,0340H,0450H,0560H,0670H,0780H
    B dW 0020h,0030h,0040H,0050H,0060H,0002H,0003H,0004H,0005H,0006H
    C dW 10 DUP(?)
datarea ends
;***********************************************
program segment

main proc far
    assume cs:program, ds:datarea
start:

;set up stack for return
    push ds    ;save old data segment
    sub ax,ax  ;put zero in AX
    push ax    ;save it on stack

;set DS register to current data segment
    mov ax,datarea
    mov ds,ax

;MAIN PART OF PROGRAM GOES HERE
    mov bx,0
    mov si,0
    mov di,0
    mov cx,150
next:    mov ax,b[si]           ;先以bx中第i个为中心
    cmp ax,a[bx]          ;将每一个ax中元素与之比较
    je found
    add bx,2
    cmp bx,30
    je add_dx               ;若bx=30,则bx中某一元素已经遍历过ax所有元素
    loop next

add_dx:
    add si,2                   ;si+2则指向bx下一个元素
    mov bx,0
    loop next


found:
    mov c[di],ax
    add di,2
    add bx,2
    cmp bx,30                 ;检查是否遍历到ax最后一个元素
    je add_dx
    loop next
;打印出C中的内容
    mov ax,0
    mov al,si
    div al,2
    mov cx,ax  ;C中元素个数
print:    mov dx,c[si]
    mov ah,02h
    int 21h
    mov dl,20h
    mov ah,02h
    int 21h
    add si,2
    loop print
    ret
main endp                         ;end of main part of program
    mov ax,4c00h
    int 21h
program ends                    ;end of code segment

end start

6、XCHG指令的应用--加密表

编写一个程序,接受从键盘输入的10个十进制数字,输入回车符则停止输入,然后将这些数字加密后(用XLAT指令变换)存入内存缓冲区BUFFER。加密表为:

输入数字:0,1,2,3,4,5,6,7,8,9

密码数字:7,5,9,1,3,6,8,0,2,4

;*********************************************

datarea segment             
    tip     db 'Please input a 10-length number: ','$'
    ary       dw 10 dup(?)
    pwd    db  7,5,9,1,3,6,8,0,2,4
    
    buffer  db  10  dup(?)

datarea   ends

;*********************************************

prognam segment         

;--------------------------------------

main proc far        

   assume cs:prognam,ds:datarea

start:                    

;set up stack for return
   
    push ds            ;save old data segment
   
    sub   ax,ax        ;put zero in ax
   
    push  ax           ;save it on stack

;save DS register to current data segment
   
    mov ax,datarea     ;datarea segment address
   
    mov ds,ax                 ;into ds register
   

;MIAN PART OF PROGRAM GOES HERE
    lea dx,tip
    mov ah,09h
    int 21h
    ;换行
    mov dl,0dh
    mov ah,02h
    int 21h
    mov dl,0ah
    mov ah,2
    int 21h    
    mov si,0
;input number
    lea bx,ary
    mov cx,10
input:    mov ah,01h
    
    int 21h
    
    sub al,30h   ;判断输入字符是否为数字
    js exit          ;若输入有误,直接退出
    cmp al,09h
    jg exit
    mov [bx],word ptr al
    add dx,2
    loop input

    lea bx,pwd      ;加密
    mov cx,10
    
    mov  si,0
change:    mov al,ary[si]
   
    xlat  
    
    mov  buffer[si],al   ;将加密后的数写入buffer
    
    inc   si
    
    loop  change 
exit:    mov ah,4ch
    int 21h
    ret
   

main endp       ;end of main part of prognam

;------------------------------------------

prognam  ends

;**********************************************

end  start 

7、DOS 0A号功能获得用户输入字符串,其中可以自动计算字符长长度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值