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

零、无关内容

汇编语言语法练习与代码转换设计是计算机科学中的一个重要领域,它涉及到将高级语言编写的程序转换为汇编语言代码,以及直接使用汇编语言进行编程。以下将介绍汇编语言的基本概念、语法练习的重要性以及代码转换设计的方法。

1、汇编语言基本概念

汇编语言是一种低级编程语言,它直接对应于计算机的硬件结构。在汇编语言中,每一条指令都对应于计算机的一种基本操作,如数据传输、算术运算或控制操作等。由于汇编语言提供了对硬件资源的直接控制,它常被用于系统开发、性能优化和底层编程等领域。

2、语法练习的重要性

  1. 理解计算机工作原理:通过汇编语言语法练习,可以深入理解计算机的基本工作原理,包括指令执行、内存访问和输入输出处理等。
  2. 提升编程技能:汇编语言要求程序员对程序的每个细节都有精确的控制,这有助于提升编程技能,特别是在内存管理和性能优化方面。
  3. 为学习其他语言打下基础:了解汇编语言可以帮助理解高级语言的实现机制,为学习其他编程语言打下坚实的基础。

3、代码转换设计方法

代码转换设计是将高级语言编写的程序转换为汇编语言代码的过程。以下是一些常见的设计方法:

  1. 词法分析:将高级语言程序分解为一系列的词汇单元,如关键字、标识符和常量等。
  2. 语法分析:根据高级语言的语法规则,将词汇单元组合成有意义的语法结构,如表达式、语句和块等。
  3. 语义分析:检查语法结构是否满足语义要求,如类型匹配、作用域规则和初始化等。
  4. 代码生成:根据语义分析的结果,生成对应的汇编语言代码。这通常涉及到寄存器分配、指令选择和地址计算等。

4、示例:代码转换设计

假设我们有一个非常简单的高级语言程序,它包含一个赋值语句和一个输出语句:

int x = 42;
print(x);

这个程序的代码转换设计过程可能包括以下步骤:

  1. 词法分析:将程序分解为词汇单元,如intx=42;print();等。
  2. 语法分析:将词汇单元组合成语法结构,如int x = 42;print(x);等。
  3. 语义分析:检查语法结构是否满足语义要求,如x是否已经声明,42是否是合法的整数等。
  4. 代码生成:生成对应的汇编语言代码。这可能涉及到为x分配内存空间,将42写入x的内存空间,以及调用print函数等操作。

最终生成的汇编语言代码可能类似于以下形式:

; 分配内存空间
mov eax, 42
mov [x], eax
; 调用 print 函数
push x
call print
add esp, 4

这个例子展示了代码转换设计的基本过程,实际应用中可能需要处理更复杂的语法结构和语义要求。

总之,汇编语言语法练习与代码转换设计是计算机科学中的重要领域,它有助于理解计算机的工作原理,提升编程技能,并为学习其他编程语言打下基础。通过词法分析、语法分析、语义分析和代码生成等步骤,可以将高级语言程序转换为汇编语言代码,实现对硬件资源的直接控制和优化。

一、程序改错(显示25+9=34)

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


.486
DATA SEGMENT  USE16             ; error1: SEGMENT 关键词有空格


SUM     DB  ?,?                 ; error2: 多了一个逗号



MESG    DB  '25+9='
        DB  0, 0, '$'				; error3: 添加结束标志 '$'

N1      DB  9,	0F0H              	; error4: 十六进制字母开头的数字,需要以0开始
N2      DB  25                  	; error5: 数据类型为DB
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 MESG   		; error6: 是MESG不是MEST 
        INT 	21H	
        MOV 	AH,		4CH
        INT 	21H

CHANG PROC								; error7: 不用加冒号
LAST:
        CMP  	byte ptr [BX],	10		; error8: 指定内存单元大小
        JC  	NEXT
        SUB  	byte ptr [BX],	10		; error9: 指定内存单元大小
        INC 	byte ptr [BX+7]			; error10: 指定内存单元大小
        JMP 	LAST
        

NEXT:   
        MOV 	AH,					SUM		; error11:
		ADD 	[BX+8],				AH
		ADD 	BYTE PTR [BX+7],	30H 	; error12: 长度不匹配
		ADD 	BYTE PTR [BX+8],	30H  	; error13: 放个位上的数
        RET
CHANG	ENDP								; error14: 不用加冒号
CODE    ENDS
END     BEG

请添加图片描述

二、统计字符串(42H~45H)

从BUF单元开始存有一字符串(长度<255),编程实现统计该字符串中的ASCII在42H~45H之间的字符个数,并将统计结果以二进制形式显示在屏幕。


.486
DATA SEGMENT USE16
BUF     DB     'ABBBCDEFGH'     ; 实质: 统计BCDE的个数
COUNT   EQU    $-BUF            ; COUNT: 字符串长度
DATA    ENDS
 
CODE SEGMENT USE16
    ASSUME CS:CODE,DS:DATA
BEG:    MOV     AX,     DATA
        MOV     DS,     AX
        MOV     BL,     0       	; BL=满足条件的字符个数,初始值为0
        MOV     SI,     0           ; BUF数组下标,初始值为0
        MOV     CX,     COUNT
        CALL    COMPARE	          	; 调用比较函数
        CALL    DISP
EXIT:   MOV     AH,     4CH
        INT     21H
    
COMPARE PROC
LAST:   CMP     BUF[SI],    42H
        JC      NEXT            	; 小于 42H, JUMP NEXT
        CMP     BUF[SI],    45H
        JA      NEXT        		; 大于 45H, jump
        INC     BL      			; 8位
NEXT:   INC     SI
        LOOP    LAST
        RET             			; 子程序返回
COMPARE ENDP
 
DISP    PROC            			; 以二进制输出,BL中存储的就是二进制
        MOV     CL,		8    		; 显示位8位
LAST:   MOV     DL,		'0'
        RCL     BL,		1  		  	; 带进位的循环左移
        JNC     NEXT    			; C=0,则跳转直接显示
        MOV     DL,		'1'
NEXT:   MOV     AH,		2
        INT     21H
        LOOP    LAST
        RET
DISP    ENDP
 
CODE    ENDS
        END     BEG

请添加图片描述
请添加图片描述

我们输入的是字符串是 ‘ABBBCDEFGH’,在范围42H~45H,即字符等于BCDE的个数为 00000110,为 5 个,结果正确

  • 19
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
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 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

亦是远方

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

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

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

打赏作者

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

抵扣说明:

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

余额充值