汇编语言课程作业——编译显示十六进制数

1、编译显示四位十六进制 0A490H
DATA	SEGMENT
	M	DW	0A490H
DATA	ENDS

CODE	SEGMENT
	ASSUME	CS:CODE,DS:DATA

START:	MOV	AX,DATA
	MOV	DS,AX
	MOV	AX,M
	CALL	DISP4
	INT	20H
	
DISP4	PROC	NEAR	
	PUSH	BX
	PUSH	CX
	PUSH	DX
	PUSH	AX
	MOV	AL,AH
	CALL	DISP2
	POP	AX
	CALL	DISP2
	POP	DX
	POP	CX
	POP	BX
	RET
DISP4	ENDP
DISP2	PROC	NEAR
	MOV	BL,AL
	MOV	DL,AL
	MOV	CL,4
	ROL	DL,CL
	AND	DL,0FH
	CALL	DISP1
	MOV	DL,BL
	AND	DL,0FH
	CALL	DISP1
	RET
DISP2	ENDP
DISP1	PROC
	OR	DL,30H
	CMP	DL,3AH
	JB	DDD
	ADD	DL,07H
DDD:	MOV	AH,2
	INT	21H
	RET
DISP1	ENDP

CODE	ENDS
	END	START

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2、编译显示两位十六进制 0A4H
DATA	SEGMENT
	M	DB	0A4H
DATA	ENDS

CODE	SEGMENT
	ASSUME	CS:CODE,DS:DATA


START:	MOV	AX,DATA
	MOV	DS,AX
	MOV	AL,M
	CALL	DISP2
	INT	20H
	
DISP2	PROC	NEAR
	MOV	BL,AL
	MOV	DL,AL
	MOV	CL,4
	ROL	DL,CL
	AND	DL,0FH
	CALL	DISP1
	MOV	DL,BL
	AND	DL,0FH
	CALL	DISP1
	RET
DISP2	ENDP
DISP1	PROC
	OR	DL,30H
	CMP	DL,3AH
	JB	DDD
	ADD	DL,07H
DDD:	MOV	AH,2
	INT	21H
	RET
DISP1	ENDP



CODE	ENDS
	END	START



在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

遇到的问题及解决方法:

在这里插入图片描述

1、Block nesting error

嵌套出错。嵌套的过程,段,结构,宏指令或重复块等非正常结束.例如在嵌套语句中有外层的结束语句,而无内层的结束语局

解决方法:添加结束语句。

2、Phase error between passes

两次扫描间的遍错。一个标号在二次扫描时得到不同的地址值,就会给出这种错误,一般错在起始终止符不配对,或循环内错误。若在启动MASM时使用/D任选项,产生第一遍扫描的列表文件,它可帮助你查找这种错误

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下面是一个示例 x86 汇编程序,它将输入的十进制转换为十六进制并输出: ``` section .data msg db 'Enter a decimal number: ',0 hexmsg db 'The number in hexadecimal is: ',0 newline db 10,13,0 section .bss num resd 1 section .text global _start _start: ; 输出提示信息 mov eax, 4 ; 系统调用号 4 表示写入 mov ebx, 1 ; 文件描述符 1 表示标准输出 mov ecx, msg ; 要输出的字符串地址 mov edx, 22 ; 要输出的字符串长度 int 0x80 ; 调用系统调用 ; 读取输入的十进制 mov eax, 3 ; 系统调用号 3 表示读取 mov ebx, 0 ; 文件描述符 0 表示标准输入 mov ecx, num ; 存储输入据的内存地址 mov edx, 4 ; 要读取的字节 int 0x80 ; 调用系统调用 ; 将输入的十进制转换为十六进制 mov eax, [num] ; 将输入的十进制存储在 EAX mov ebx, 16 ; 除为 16 xor ecx, ecx ; 将 ECX 清零 mov edi, 0 ; 将 EDI 清零,用于存储十六进制 convert_loop: xor edx, edx ; 将 EDX 清零 div ebx ; 用除除以 EAX,商在 EAX ,余在 EDX cmp eax, 0 ; 判断商是否为 0 je convert_done ; 如果商为 0,表示转换完成 mov eax, edx ; 将余存储在 EAX add al, 48 ; 将余转换为 ASCII 码 cmp al, 58 ; 判断是否大于等于 '9' jle store_hex ; 如果不大于等于 '9',跳转到存储十六进制的部分 add al, 7 ; 如果大于 '9',将 ASCII 码加上 7,得到 A~F store_hex: mov [edi], al ; 将转换后的十六进制存储在 EDI 指向的内存地址 inc edi ; 增加 EDI 的值,指向下一个内存地址 inc ecx ; 增加计器 ECX 的值 jmp convert_loop ; 跳转到循环开始处,继续转换 convert_done: ; 输出转换后的十六进制 mov eax, 4 ; 系统调用号 4 表示写入 mov ebx, 1 ; 文件描述符 1 表示标准输出 mov ecx, hexmsg ; 要输出的字符串地址 mov edx, 28 ; 要输出的字符串长度 int 0x80 ; 调用系统调用 mov ebx, 1 ; 文件描述符 1 表示标准输出 mov ecx, edi ; 存储十六进制的内存地址 mov edx, ecx ; 要输出的字节为计器 ECX 的值 int 0x80 ; 调用系统调用 ; 输出换行符 mov eax, 4 ; 系统调用号 4 表示写入 mov ebx, 1 ; 文件描述符 1 表示标准输出 mov ecx, newline ; 要输出的字符串地址 mov edx, 3 ; 要输出的字符串长度 int 0x80 ; 调用系统调用 ; 退出程序 mov eax, 1 ; 系统调用号 1 表示退出 xor ebx, ebx ; 返回值为 0 int 0x80 ; 调用系统调用 ``` 这个程序的工作步骤如下: 1. 输出提示信息,要求用户输入一个十进制。 2. 从标准输入读取一个四字节的十进制。 3. 将输入的十进制转换为十六进制。 4. 输出转换后的十六进制。 5. 输出一个换行符。 6. 退出程序。 该程序使用除法运算将输入的十进制转换为十六进制,并将转换后的结果存储在内存。转换后的十六进制以 ASCII 码的形式输出。注意,该程序假定输入的十进制是非负整,如果输入的是负,需要进行特殊处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

玳宸

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

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

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

打赏作者

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

抵扣说明:

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

余额充值