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

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

实验环境

  • DosBox
  • Tasm

实验一:在屏幕下打印学号

实验代码

说实话,第一个实验就是用来熟悉IDE环境的= =先贴一下实验代码吧。

              .586
        DATA  SEGMENT USE16         	;定义数据段
        MESG  DB 'Hello, world!', '$'
        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               	;汇编结束

把自己的学号修改一下就是实验的代码了。

DOSBOX使用记录

DosBox的安装是傻瓜式的安装,无论是在IA-32架构下还是在AMD64的架构下。所以这里就不贴了。
第一步是在DosBox环境下将本地文件夹挂载到DOS下面。使用如下命令挂载

mount c YouFilePath

需要注意的有两个点:

  1. 这里的本地文件夹路径最好是不要带有中文,因为在Dos环境下是只支持英文字符集的;
  2. 如果本地文件/文件夹的路径过长的话会出现波浪号,原因在于DOS环境下的文件名最多只有8个字符,超过8个字符会缩写。

在这里插入图片描述挂载完使用如下指令进行汇编

TASM SAYHI.ASM

需要注意的是TASM和SAYHI.ASM需要使用相对路径。
编译完成之后进行连接

TLINK	SAYHI.OBJ

注意点同上。
连接完成之后运行。
在这里插入图片描述

实验二:改错汇编源代码

先贴一下错误的实验代码吧。

;FILENAME   EXA131.ASM
.486
DATA SEGME  NT  USE16
SUM     DB  ?,?,
MESG    DB  '25+9='
        DB  0,0
N1      DB  9,F0H
N2      DW  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
        INT 21H
        MOV AH,4CH
        INT 21H
CHANG:  PROC
LAST:   CMP [BX],10
        JC  NEXT
        SUB [BX],10
        INC [BX+7]
        JMP LAST
NEXT:   ADD [BX+8],SUM
        ADD [BX+7],30H
        ADD [BX+8],30H
        RET
CHANG   ENDP
CODE    ENDS
END    BEG

直接进行汇编的话会出现如下错误。

在这里插入图片描述照着行数改就是了。我贴一份我修改好的代码并进行了代码解析

;FILENAME   EXA131.ASM
.486
DATA SEGMENT  USE16;SEGMENT关键词有缩写

;用于保存结果的二进制数
SUM     DB  ?,?;多了一个逗号
;用于保存结果的二进制数

;显示的字符串
MESG    DB  '25+9='
        DB  0,0,'$';添加结束符
;显示的字符串

N1      DB  9,0F0H;十六进制开头需要以0开始,但是第二个没有用到,这里保留
N2      DB  25;根据N1和16行可知该数据类型为DB
DATA    ENDS

CODE    SEGMENT USE16
ASSUME  CS:CODE,DS:DATA

BEG:    
        MOV AX,DATA
        MOV DS,AX
        MOV BX,OFFSET   SUM
        ;计算N1+N2,并将结果保存到SUM处
        MOV AH,N1
        MOV AL,N2
        ADD AH,AL
        MOV [BX],AH
        ;计算N1+N2,并将结果保存到SUM处

        ;CHANG功能为转发字符串
        CALL CHANG
        ;CHANG功能为转发字符串

        ;调用DOS显示功能
        MOV AH,9
        MOV DX,OFFSET   MESG;是MESG不是MEST
        INT 21H
        ;调用DOS显示功能

        ;调用DOS退出功能
        MOV AH,4CH
        INT 21H
        ;调用DOS退出功能

CHANG:  
LAST:   

        ;算法:由于只有两位数,每次减10,并且显示位(十位)加1直到SUM小于10
        CMP  byte ptr [BX],10;指定内存单元大小
        JC  NEXT
        SUB  byte ptr [BX],10;指定内存单元大小
        INC byte ptr [BX+7];指定内存单元大小
        JMP LAST
        ;算法:由于只有两位数,每次减10,并且显示位(十位)加1直到SUM小于10

NEXT:   
        ;将个位数移到显示位(个位)上

        ;ADD指令不能两个操作数均为内存地址,且AH没有被使用,使用AH来中转
        MOV  AH,[BX]
        MOV  [BX+8],AH
        ;ADD指令不能两个操作数均为内存地址,且AH没有被使用,使用AH来中转

        ;将个位数移到显示位(个位)上

        ;0x30为字符'0'的ASCII码表

        ADD  byte ptr [BX+7],30H
        ADD [BX+8],30H

        ;0x30为字符'0'的ASCII码表
        RET
CODE    ENDS
END     BEG

编译运行,通过。
在这里插入图片描述

  • 16
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 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 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值