微机原理的速成

学习经验:

在学习微机原理的时候课本上基本上只有关键词解释,基本上没有代码可以看和学习,但是最后的考试和平时的实验课又需要打代码,导致没有听课在看书学起来很痛苦,在这里点名批评《新编16_32位微型计算机原理及应用 第4版》这本书一言难尽,就算是听课了学起来也很痛苦。我的建议是学完前两章去看我推荐的另外一本书《汇编语言程序设计》这本书的关键词解释多,代码也多一些学起来很舒服,不会那么苦涩难懂

链接:https://pan.baidu.com/s/1Ot-R-bK4esjcR9YdXjsMZg?pwd=hb66 
提取码:hb66 
--来自百度网盘超级会员V3的分享
网盘里是三本书
《新编16_32位微型计算机原理及应用 第4版》
《新编16_32位微型计算机原理及应用--第4版--教学指导与习题详解》
《汇编语言程序设计》

这里分享一些平时的实验课的题目

(1-8)编写程序,将三个无符号字操作数X、Y、Z中的最大值送入MAX字单元中存储。

data segment
    max dw ?
    num dw 35h,34h,33h
ends
code segment
start:
    mov ax, data
    mov ds, ax
    mov es, ax
    
    mov si,0
    mov ax,num[si] 
    mov bx,num[si+2h]
    cmp bx,ax
    jnb p1  
    mov bx,num[si+4h] 
    cmp bx,ax
    jnb print     
    xchg bx,ax
    jmp print    
p1:
    mov ax,num[si+4h] 
    cmp bx,ax
    jnb print    
    xchg bx,ax
    jmp print     
print:	
    mov max,bx
    mov dx,max 
    mov ax, 4c00h
    int 21h    
ends

end start

(2-8)编写程序,计算Y的值, X和Y之间的函数关系式如下,其中X、Y均为字节型变量。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VT8xBOS1-1687540443207)(./assets/image-20230619135859839.png)]

data segment
    x db 1
    Y db 2
ends
code segment
    ASSUME cs:code,ds:DATA
start:
    mov ax, data
    mov ds, ax
    mov al,x 
    mov bl,y
    cmp al,0
    ja l1  
    jb l2  
    mov bl,0
    jmp  l3
l1:mov bl,1h
    jmp  l3
l2:mov bl,-1h  
    jmp  l3
l3:  mov ah,4ch
int 21h    
ends

end start

(3-8)设变量Buffer中存放3个有符号字操作数,求这3个数中的最小值,并将其存放在BX寄存器中。

data segment
    min dw ?
    Buffer dw 35h,34h,33h
ends
code segment
start:
    mov ax, data
    mov ds, ax
    mov es, ax
    
    mov si,0
    mov ax,Buffer[si] 
    mov bx,Buffer[si+2h]
    cmp bx,ax
    jle p1  
    mov bx,Buffer[si+4h] 
    cmp bx,ax
    jle print     
    xchg bx,ax
    jmp print    
p1:
    mov ax,Buffer[si+4h] 
    cmp bx,ax
    jle print    
    xchg bx,ax
    jmp print     
print:	
    mov min,bx
    mov bx,min 
    mov ax, 4c00h
    int 21h    
ends

end start

(4-9)在变量DBUF中存放10个有符号字节数,统计此数据区中正数、零和负数的个数,并分别将统计结果保存在字节变量PLUS、ZERO和MINS中。

DATA SEGMENT
    BUFFER DB 1,2,3,4,5,6,-1,0,0,0
    PLUS DB 0
    ZERO DB 0
    MINS DB 0
    DATA ENDS
CODE SEGMENT
    ASSUME CS:CODE,DS:DATA
    START:
    MOV AX,DATA
    MOV CX,10
    MOV DS,AX
    MOV SI,0
    MOV AH,0
    MOV BH,0
    MOV BL,0
    L:MOV AL,BUFFER[SI]
    CMP AL,0
    JGE L1
    ADD BL,1
    JMP L3
    L1:
    CMP AL,0
    JG L2
    ADD BH,1
    JMP L3
    L2:
    ADD AH,1
    L3:
    DEC CX
    ADD SI,1
    CMP CX,0
    JNZ L
    MOV PLUS,AH
    MOV ZERO,BH
    MOV MINS,BL
    MOV AH,4CH
    INT 21H
    CODE ENDS
END START

(5-9)2、统计字变量D1中二进制位为1的个数,并将统计结果保存在变量RESULT中。(例如,D1=0035H,则其中二进制位为1的个数为4,若D1=1075H,则其中二进制位为1的个数为6。)

【一种实现方法提示:循环16次,每次循环将AX内容逻辑右移1次,移出的值在CF中,再用ADC DL,0语句累加CF,结果保存在DL中。还可以有其他实现方法。】

DATA SEGMENT
    BUFFER DW 1075H
    RESULT DB 0
    DATA ENDS
STACK SEGMENT STACK
    DB 1000 DUP(0)
    STACK ENDS
CODE SEGMENT
    ASSUME CS:CODE,DS:DATA,SS:STACK
    START:MOV AX,DATA
    MOV DS,AX
    MOV AX,BUFFER
    MOV CL,0
    L:
    AND AX,AX
    JZ L2
    SHL AX,1
    JNC L
    INC CL
    JMP L
    L2:
    MOV RESULT,CL
    MOV AH,4CH
    INT 21H
    CODE ENDS
ENDS START

(6-10) 每次从键盘输入一个大写字母,并将其转换为相应的小写字母输出显示到屏幕上,然后继续输入下一个字母;此转换一直进行到输入“#”号为止;若输入过程中输入了除大写字母和“#”以外的其他字符,则在屏幕上给出错误提示信息:“ERROR!”,并继续进行下一个大写字母的输入。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9JqRiMdg-1687540443208)(./assets/image-20230619140548733.png)]

data segment
    D1 DB 'ERROR' ,0DH,0AH,'$'
ENDS
STACK SEGMENT
    DW   128  DUP(0)
ENDS
CODE SEGMENT
    ASSUME DS:DATA,SS:STACK,CS;CODE;
START:
; SET SEGMENT REGISTERS:
    MOV AX, DATA
    MOV DS, AX
    MOV ES, AX
    MOV AH, 01H   
    INT 21H
    CMP AL, '#'  
    JE EXIT
    CMP AL, 'A'   
    JB ERROR
    CMP AL, 'Z'
    JA ERROR    
     CMP AL, 'A'   
    JA X
    CMP AL, 'Z'
    JB X
   X: 
      ADD AL, 20H
    MOV AH, 02H   
    MOV DL,AL
    INT 21H
    JMP  START 
ERROR:
    MOV DX, OFFSET D1   
    MOV AH, 09H
    INT 21H
    JMP START
EXIT:
    MOV AH, 4CH   
    INT 21H
        
    MOV AX, 4C00H
ENDS

END START

(7-11)将BX寄存器中的数以十六进制数形式显示在屏幕上。例如,BX=13A4H,则在屏幕上显示13A4。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iQ05LC8Q-1687540443209)(./assets/image-20230619140743838.png)]

DATA SEGMENT
    BUF DB 0AH,0DH,
    BUF0 DB 6 DUP(0) 
ENDS

STACK SEGMENT
    DW   256  DUP(0)
ENDS
CODE SEGMENT
    ASSUME CS:CODE,SS:STACK,DS:DATA
START:
    MOV AX, DATA
    MOV DS, AX
    MOV BX,13A4H
    LEA DI,BUF0
    MOV CH,4
NEXT:
    MOV CL,4
    ROL BX,CL
    MOV AL,BL
    AND AL,0FH
    OR AL,30H
    CMP AL,3AH
    JL DONE
    ADD AL,07H
DONE:
    MOV [DI],AL
    INC DI
    DEC CH
    JNZ NEXT
    MOV BYTE PTR[DI],'H'
    INC DI
    MOV BYTE PTR[DI],'$'
    LEA DX,BUF
    MOV AH,9
    INT 21H
    MOV AH, 4CH
    INT 21H    
ENDS
END START

(8-12)编程统计字符串中的数字、字母及其他字符(除数字、字母外)的个数,统计结果分别存放在num, char, other单元中。待检测的字符串为”In 1990, the exchange rate was 8.1 /$”。

DATA SEGMENT
    STRING DB "IN 1990, THE EXCHANGE RATE WAS 8.1 /$"
    STREND DB '?'
    NUM DB 0
    CHAR DB 0
    OTHER DB 0
DATA ENDS

CODE SEGMENT
    ASSUME DS:DATA,CS:CODE
START:
    MOV AX, DATA
    MOV DS, AX
    MOV ES, AX                  ; 默认附加段与数据段重叠
    MOV CX, STREND-STRING       ; 字符串长度 
    MOV SI, OFFSET STRING       ; 源变址指针指向STRING
    
CONTINUE:
    MOV DL, [SI]    ;读取一个字符
    CMP DL, 30H
    JL  OTHER_CHAR
    CMP DL, 3AH
    JL  NUM_CHAR
    CMP DL, 41H
    JL  OTHER_CHAR
    CMP DL, 5BH
    JL  ALPHA_CHAR
    CMP DL, 61H
    JL OTHER_CHAR
    CMP DL, 7BH
    JL  ALPHA_CHAR
    
OTHER_CHAR:
    INC OTHER
    JMP NEXT 
NUM_CHAR:
    INC NUM
    JMP NEXT        
ALPHA_CHAR:
    INC CHAR
NEXT:
    INC SI
    
    LOOP CONTINUE
 
CODE ENDS
        END START

(9-12)2、假设有30个学生的成绩分别为3 28 5 10 82 69 32 95 3 44 38 77 80 19 49 45 65 71 75 28 68 66 16 12 50 96 34 59 22 75, 编程统计60分以下、6069分、7079分、8089分、9099分、100分各分数段的人数,并存放到S4,S5, S6, S7, S8, S9, S10单元中。

DATA SEGMENT
    SCORE DB 56,69,84,82,73,88,99,63,100,80
    S5 DB 0
    S6 DB 0
    S7 DB 0
    S8 DB 0
    S9 DB 0
    S10 DB 0
DATA ENDS
 
CODE SEGMENT
    ASSUME DS:DATA,CS:CODE
START:
    MOV AX, DATA
    MOV DS, AX
    MOV ES, AX         ; 默认附加段与数据段重叠
    MOV SI, OFFSET SCORE ; 源变址指针指向SCORE
    MOV CX, 10
CONTINUE:
    MOV DL, [SI]    ;读取一个成绩
    CMP DL, 60      ;与60分比较
    JL  LS5         ;小于60分,转到LS5
    CMP DL, 70
    JL  LS6
    CMP DL, 80
    JL  LS7
    CMP DL, 90
    JL  LS8
    CMP DL, 100
    JL  LS9
    JMP LS10
    
LS5:    INC S5
        JMP NEXT
LS6:    INC S6
        JMP NEXT
LS7:    INC S7
        JMP NEXT
LS8:    INC S8
        JMP NEXT
LS9:    INC S9
        JMP NEXT
LS10:   INC S10
        JMP NEXT
NEXT:
        INC SI      ;指针加1,指向下一个分数
        LOOP CONTINUE
CODE ENDS
        END START

(10-13)设有一数据区有10个无符号数的字节数据,位于数据段偏移地址为1000H开始的10个内存单元中。编写程序找出其中的最大数和最小数分别放置于BH和BL,并求最大最小值的平均值存放于AL中。要求将求最大最小值设计为子程序。

data segment
 n1 db 01h,74h,43h,78h,98h,0a1h,0abh,0b1h,0bdh ,0afh
 num EQU ($-n1)+1
ends

stack segment stack
    dw   128  dup(0)
ends

code segment 
    assume CS:code,DS:data,SS:stack
start:
; set segment registers:
    mov ax, data
    mov ds, ax
    mov es, ax

    mov cl,num
    lea si,n1
    
    l3: call p1
    mov bh,dh ;最大值放入bh 
    mov ah,0  ;置零
    mov ah,bl ;放入最小值
    add ah,bh ;放入最大值
    shr ah,1  ;左移除二               

    
    mov ax, 4c00h 
    int 21h 
 p1 proc near
    mov dh,[si]
    mov bl,[si] 
l:  mov bh,[si]
    inc si
    dec cl       
    jz end
    cmp bl,bh ;经过比较放入较小值,比较完毕为最小值
    ja l1
    cmp dh,bh
    jb l2
    jmp l 
 l1:mov bl,bh
    jmp l
 l2:mov dh,bh
    jmp l
end:mov cx,0;转跳结束随便输入
    ret
  p1 endp
ends

end start ; set entry point and stop the assembler.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热烈的眼泪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值