南京邮电大学汇编语言程序设计实验一:汇编语言语法练习与代码转换

一、实验目的和要求

1. 掌握汇编语言源程序的格式;

2. 进一步学习汇编语言源程序的编辑、汇编、目标文件的链接和可执行文件的执行全过程;

3. 掌握编辑软件、TASM/MASM、TLINK和TD的使用方法、掌握汇编语言的语法规则。

4. 实验内容:

(1)练习并掌握汇编语言开发全过程,在屏幕打印各自学号,要求在命令行下进行汇编程序编译,汇编源程序的文件名命名为各自学号。

(2)排除语法错误:给出的是一个通过比较法完成8位二进制数转换成十进制数送屏幕显示功能的汇编语言源程序,但有很多语法错误。要求实验者按照原样对源程序进行编辑,汇编后,根据TASM给出的信息对源程序进行修改,知道没有语法错误为止。然后进行链接,并执行相应可执行文件。正确的执行结果在屏幕上显示:25+9=34。

二、实验过程描述与结果分析

1)汇编语言开发步骤

汇编语言源程序编写好以后, 必须经过下列几个步骤才能在机器上运行:

1.将源程序通过调编辑程序编辑成.ASM文件;

2.将.ASM文件通过调汇编程序汇编成.OBJ文件;

3.将.OBJ文件库文件通过调链接程序如TLINK.EXE链接成可执行文件.EXE文件;

4.运行.EXE文件即可得到结果。

程序段为:

.586
        DATA  SEGMENT USE16         	;定义数据段
        MESG  DB 'B11111111xyz', '$'
        DATA  ENDS

        CODE  SEGMENT USE16         	;定义代码段
              ASSUME CS: CODE, DS: DATA	;说明段约定
        BEG:  MOV AX, DATA          	;BEG为启动地址
              MOV DS, AX

              MOV AH, 9
              MOV DX, OFFSET MESG
              INT 21H

              MOV AH, 4CH
              INT 21H               	;返回DOS
        CODE  ENDS
              END BEG               	;汇编结束

2)排除语法错误

要求通过比较法完成8位二进制数转换成十进制数送屏幕显示功能的汇编语言源程序。但有很多语法错误,要求按照原样对源程序进行编辑,汇编后,根据TASM给出的错误信息对源程序进行修改,直到没有语法错误为止,然后进行链接,并执行相应的可执行文件。正确的执行结果是在屏幕上显示:25+9=34。

修改后代码:(分号后为修改)

 ;FILENAME EXA131.ASM
              .486
        DATA  SEGME  NT USE16 ; DATA  SEGMENT USE16
         SUM  DB ?, ?            ;SUM  DB  '?', '?'
        MESG  DB '25+9='
              DB 0, 0             ; DB 0, 0, '$'
          N1  DB 9, F0H          ; N1  DB 9, 0F0H
          N2  DW 25             ; N2  DB 25
        DATA  ENDS
        CODE  SEGMENT USE16
              ASSUME CS: CODE, DS: DATA
        BEG:  MOV AX, DATA
              MOV DS, AX
              MOV BX, OFFSET SUM
              MOV AH, N1
              MOV AL, N2
              ADD AH, AL
              MOV [BX], AH
              CALL CHANG
              MOV AH, 9
              MOV DX, OFFSET MEST  ; MOV DX, OFFSET MESG
              INT 21H
              MOV AH, 4CH
              INT 21H
       CHANG:  PROC                 ; CHANG  PROC
       LAST:  CMP [BX], 10            ; CMP BYTE PTR[BX], 10
              JC NEXT
              SUB [BX], 10             ; SUB BYTE PTR [BX], 10
              INC [BX+7]              ; INC BYTE PTR [BX+7]
              JMP LAST
       NEXT:                          ;MOV DL, SUM
              ADD [BX+8], SUM        ; ADD BYTE PTR [BX+8], DL
              ADD [BX+7], 30H         ;ADD BYTE PTR [BX+7], 30H
              ADD [BX+8], 30H         ; ADD BYTE PTR [BX+8], 30H
              RET
       CHANG:  ENDP                 ; CHANG  ENDP
        CODE  ENDS
              END BEG

运行结果:

  • 7
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
微机原理与汇编语言-实验报告(中北大学大据学院)(前4个实验都可以直接运行,后面的几个需要用到proteus,这个要自己根据自己的情况搞,咱就不能保证在你电脑上能不能运行了) 实验一 简单程序设计 1. 编制一个简单的运算程序,并且调试完成。 2. 编制一个计算x=a2+b2 3. 验证上述结果的正确 实验二 循环、分支程序设计 1. 编制一个统计组中正负及均值的程序,并且调试完成得到正确的结果。 2. 设计计算Y=1+2+3+....,直到累加和刚好大于10000的程序并且调试完成。 3. 对给定组中的所有元素,按从大到小的顺序排序,并且加以验证。 实验三 系统能调用实验 1.编制一个具有屏幕提示和键盘输入的程序,键盘输入一个人名,在屏幕上显示“Hello 人名!”; 2.通过键盘输入一串包含大小写字母和字的字符串,统计其中大写、小写字母和字字符的个,并将结果显示在屏幕上。 实验四 8255并行接口实验 1.将8255一个端口接8个发光二极管,用不同工作方式控制其逐次点亮发光二极管。 2.将8255另一个端口接开关,用不同工作方式,编程将开关信息在发光二极管上显示出来。 3.验证上述操作的正确性,对实验结果进行解释 实验五 键盘、LED实验 1.在实验箱上,连接小键盘和LED显示器。 2.编程将键盘输入的字,显示在显示器上,在按键时,原来显示的字左移一位,新按的键值显示在最右端。 3.考虑两个键组合时的输入方法 4.对实验结果进行说明 实验六 中断实验 1.连接实验箱上的码管,通过消抖开关作为中断源。 2.编写程序,完成在中断服务程序中记录中断次,在主程序中显示按键次。 3.将消抖开关换成一般开关,用同样的程序,再测试,仔细观察,发现了什么,为什么? 实验七 定时/计实验 1.使用计器对消抖开关的按动次进行计,显示当前的计值。 2.对实验箱中系统时钟进行计,改变计初值(两个初值要相差很大),观察有什么不同。 3.8253的初值用0和1,观察结果,并加以分析。 4.分析实验结果,并对实验结果进行说明。 实验八 综合实验 1.将实验箱设计成一个电子表,该表能分时(或按键切换)显示年月日、时分秒; 2.设置按键,通过按键可以修正日期和时间,在修正日期、时间时,电子表仍然可以继续工作。 3.AD实验,用显示器显示当前AD的输入电压值,要求精确到小点后2位(选做)
1. 用汇编语言编写程序,求1~10的和。 代码如下: ``` .model small .stack 100h .data sum dw 0 .code main proc mov ax, 0 mov cx, 10 mov bx, 1 add_loop: add ax, bx inc bx loop add_loop mov sum, ax mov ah, 09h mov dx, offset msg1 int 21h mov ax, sum call disp_num mov ah, 4ch int 21h disp_num proc ; 将转换为字符串并输出 push ax push bx push cx mov bx, 10 mov cx, 0 num_loop: xor dx, dx div bx push dx inc cx test ax, ax jnz num_loop ; 输出字符串 mov ah, 02h pop ax out_loop: pop dx add dl, 30h mov ah, 02h int 21h loop out_loop ; 换行 mov ah, 02h mov dl, 0dh int 21h mov dl, 0ah int 21h ; 恢复寄存器 pop cx pop bx pop ax ret msg1 db '1 + 2 + 3 + ... + 10 = $' end main ``` 2. 用汇编语言编写程序,输入三个,输出其中最大的一个代码如下: ``` .model small .stack 100h .data a dw ? b dw ? c dw ? max dw ? msg1 db '请输入三个整,用空格隔开:$' msg2 db '最大的是:$' .code main proc mov ax, @data mov ds, ax ; 输入三个 mov ah, 09h mov dx, offset msg1 int 21h mov ah, 0ah lea dx, a int 21h lea dx, b int 21h lea dx, c int 21h ; 比较三个 mov ax, a cmp ax, b jg a_b mov ax, b a_b: cmp ax, c jg a_c mov ax, c a_c: mov max, ax ; 输出最大的 mov ah, 09h mov dx, offset msg2 int 21h mov ax, max call disp_num ; 退出程序 mov ah, 4ch int 21h disp_num proc ; 将转换为字符串并输出 push ax push bx push cx mov bx, 10 mov cx, 0 num_loop: xor dx, dx div bx push dx inc cx test ax, ax jnz num_loop ; 输出字符串 mov ah, 02h pop ax out_loop: pop dx add dl, 30h mov ah, 02h int 21h loop out_loop ; 换行 mov ah, 02h mov dl, 0dh int 21h mov dl, 0ah int 21h ; 恢复寄存器 pop cx pop bx pop ax ret end main ``` 3. 用汇编语言编写程序,输入一个正整n,输出1~n之间的所有素代码如下: ``` .model small .stack 100h .data n dw ? msg1 db '请输入一个正整:$' msg2 db '1 到 ' msg3 db ' 之间的素有:$' .code main proc mov ax, @data mov ds, ax ; 输入一个正整 mov ah, 09h mov dx, offset msg1 int 21h mov ah, 01h int 21h sub al, 30h mov n, ax ; 输出1到n之间的素 mov ah, 09h mov dx, offset msg2 int 21h mov ax, 1 call disp_num mov dx, offset msg3 int 21h mov cx, n mov bx, 2 cmp cx, bx jl end_loop mov ax, 2 prime_loop: mov dx, ax div bx cmp dx, 0 jz not_prime call disp_num mov ah, 02h mov dl, ',' int 21h not_prime: inc ax cmp ax, cx jle prime_loop end_loop: ; 退出程序 mov ah, 4ch int 21h disp_num proc ; 将转换为字符串并输出 push ax push bx push cx mov bx, 10 mov cx, 0 num_loop: xor dx, dx div bx push dx inc cx test ax, ax jnz num_loop ; 输出字符串 mov ah, 02h pop ax out_loop: pop dx add dl, 30h mov ah, 02h int 21h loop out_loop ; 恢复寄存器 pop cx pop bx pop ax ret end main ``` 4. 用汇编语言编写程序,输入一个正整n,计算1~n之间所有奇的和。 代码如下: ``` .model small .stack 100h .data n dw ? sum dw 0 msg1 db '请输入一个正整:$' msg2 db '1 到 ' msg3 db ' 之间所有奇的和为:$' .code main proc mov ax, @data mov ds, ax ; 输入一个正整 mov ah, 09h mov dx, offset msg1 int 21h mov ah, 01h int 21h sub al, 30h mov n, ax ; 计算1到n之间所有奇的和 mov ah, 09h mov dx, offset msg2 int 21h mov ax, 1 call disp_num mov dx, offset msg3 int 21h mov ax, 1 mov cx, n sum_loop: add sum, ax add ax, 2 cmp ax, cx jle sum_loop mov ax, sum call disp_num ; 退出程序 mov ah, 4ch int 21h disp_num proc ; 将转换为字符串并输出 push ax push bx push cx mov bx, 10 mov cx, 0 num_loop: xor dx, dx div bx push dx inc cx test ax, ax jnz num_loop ; 输出字符串 mov ah, 02h pop ax out_loop: pop dx add dl, 30h mov ah, 02h int 21h loop out_loop ; 换行 mov ah, 02h mov dl, 0dh int 21h mov dl, 0ah int 21h ; 恢复寄存器 pop cx pop bx pop ax ret end main ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cookie爱吃小饼干

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

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

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

打赏作者

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

抵扣说明:

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

余额充值