title: 汇编第二次上机实验
date: 2021-06-06 19:50:04

PDF
下载地址:点击下载

汇编第二次上机实验
1、 循环程序设计
数据段中已定义了一个长度为n(n>=16)的字数组M,试编写一程序求出M中绝对值最大的数,把它放在数据段的M+2n单元中,并将该数的偏移地址存放在M+2(n+1)单元中,M是数组首地址。要求:
(1)把自己学号每2位一组,分别定义前5个字的初始值。例如,某同学的学号为2195012345,则数组M的前5个字的定义为:21H,95H, 01H, 23H, 45H, 剩余的字根据程序调试需要进行初始化。
2、 分支程序设计
设计一个程序,在数据段用自己的学号定义一个字符串,字符串长度大于20,对该字符串中字符0~9字符出现的次数进行计数,计数结果存放在以COUNT为首地址的数组中,并将出现次数最多的字符和出现次数显示出来。要求:
(1)该字符串的前10个字符必须为自己的学号,例如某同学的学号为2195012345,则该字符串的定义为 ‘2195012345xxxxxxxxxxxxxxxx’,字符串中的x根据程序调试需要进行初始化;
(2)如果字符9出现的次数为5次,且是出现次数最多的字符,则在程序结束时输出: 9,5。若有多个次数相同的字符,则输出字符最大的哪个。

1、 循环程序设计

  1. datasg segment
  2. M dw 0021h,0094h,0021h,0043h,0036h,0011h,0022h,0033h,0044h,0055h,0066h,0077h,0088h,0099h,0100h
  3. ans dw ?
  4. addr dw ?
  5. ;注意用逗号分隔
  6. datasg ends
  7. codesg segment
  8. assume ds:datasg,cs:codesg
  9. start:;要加startend start 要不然数据段不正常
  10. mov ax,datasg
  11. mov ds,ax;将数据段地址送ds
  12. sub ax,ax;将ax清零
  13. mov cx,16;设置循环次数
  14. mov ax,ds:[bx];以第一个数字为最大值
  15. ;注意ds后面的括号,使用寄存器间接寻址
  16. ;时只能用bx,bp,si,di,不能用ax
  17. mov ans,ax
  18. mov addr,bx
  19. add bx,2
  20. j :cmp ax,ds:[bx];与后一个数比较
  21. jl c;小于则将后一个数置为最大
  22. add bx,2;不小于则向后比较
  23. loop j
  24. jmp e;结束
  25. c :mov ax,ds:[bx];更换最大数
  26. mov ans,ax
  27. mov addr,bx
  28. dec cx;判断循环次数
  29. cmp cx,0
  30. je e;结束
  31. add bx,2;向后比较
  32. jmp j;回到比较环节
  33. e :mov ax,4c00h
  34. int 21h
  35. codesg ends
  36. end start

2、 分支程序设计


codesg segment
    assume ds:datasg,cs:codesg
start:
    mov ax,datasg
    mov ds,ax
    mov dx,0
    mov si,0
    lea di,COUNT
    mov cx,28;设置循环次数
;计数模块
j1: mov bl,ds:[si]
    mov bh,0
    inc byte ptr ds:[bx+di-30h]
    inc si
    loop j1
;找出出现最多的字符
    lea si,COUNT
    mov bx,0
    mov cx,9
    sub ax,ax;将ax清零
    mov al,ds:[bx+si];
    mov ans,bl
    mov time,al
    inc bx

j2 :cmp al,ds:[bx+si];与后一个数比较
    jl  c;小于则将后一个数置为最大
    je  equal;相等判断
    inc bx;不小于则向后比较
    loop j2
    jmp en;结束
c  :mov al,ds:[bx+si];更换最大数
    mov ans,bl
    mov time,al
    dec cx;判断循环次数
    cmp cx,0
    je en;结束
    inc bx;向后比较
    jmp j2;回到比较环节
equal:;相等情况
    cmp bl,ans
    jg c
    inc bx
    dec cx
    cmp cx,0
    je en
    jmp j2
;输出!!!!!
en: add byte ptr ans,30h
    add byte ptr time,30h;转ascii码
    mov dx,offset ans;注意输出方式
    mov ah,09h
    int 21h

    mov dx,offset time
    mov ah,09h
    int 21h

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

程序在DOSBox下直接运行的截图
汇编第二次上机实验 - 图1