用32位汇编语言BUF 中的二进制数为 (7A9BI, -64BEH, -OEF881!,-1,820,-820),编写程序:首先 L按有符号士进数显示输出(中间用空格隔开):回车换行:然后按无符号十进数显示 第1页共4页 输出(中间用空格隔开)
时间: 2023-12-10 11:39:04 浏览: 81
汇编试验 (1)将 BUF开始的 10 个单元中的二进制数转换成两位十六进制数的 ASCII 码,在屏幕上显示出来。要求码型转换通过子程序 HEXAC实现,在转换过程中,通过子程序 DISP实现显示. (2)编程实现从键盘接受一个字符串,再从键盘接受一查找的字符(例如’g’) ,找到时提示’Yes,found !’,找不到时提示’No found !’ 。
4星 · 用户满意度95%
以下是用NASM语言编写的程序,可以将BUF中的二进制数按有符号十六进制和无符号十进制分别输出:
```assembly
section .data
BUF db 0x7A, 0x9B, -0x64, -0xBE, -0xEF, 0x88, 0x1, 0x82, 0x0, -0x82, 0x0
MSG1 db "有符号十六进制:", 0
MSG2 db "无符号十进制:第", 0
MSG3 db "页,共4页", 0
CR_LF db 0x0D, 0x0A, 0
section .text
global _start
_start:
; 计算BUF中元素的数量
mov ecx, BUF
mov ebx, 0
count:
cmp byte [ecx], 0
je end_count
inc ebx
inc ecx
jmp count
end_count:
mov esi, BUF ; ESI指向BUF的开头
mov edi, MSG1 ; EDI指向MSG1的开头
mov ecx, ebx ; 加载BUF元素的数量
mov eax, 4 ; 调用SYS_WRITE
mov ebx, 1 ; 输出到标准输出
int 0x80
; 循环处理BUF中的元素
mov ecx, ebx ; 加载BUF元素的数量
mov ebx, 0 ; 重置EBX为零
mov eax, 4 ; 调用SYS_WRITE
mov edx, 1 ; 输出一个字节
convert_signed_hex:
mov eax, [esi + ebx] ; 加载BUF中的一个字节到EAX
add eax, 0x100 ; 将有符号数转换为无符号数
call print_hex ; 输出该字节的十六进制表示
mov eax, ' ' ; 输出一个空格
int 0x80
inc ebx ; 处理下一个字节
cmp ebx, ecx ; 检查是否处理完所有元素
jl convert_signed_hex
; 输出回车换行
mov eax, CR_LF
mov edx, 2
int 0x80
; 循环处理BUF中的元素
mov ecx, ebx ; 加载BUF元素的数量
mov ebx, 0 ; 重置EBX为零
mov eax, 4 ; 调用SYS_WRITE
mov edx, 1 ; 输出一个字节
mov edi, MSG2 ; EDI指向MSG2的开头
int 0x80
mov ebx, 1 ; 页数从1开始
convert_unsigned_dec:
mov eax, [esi + ebx - 1] ; 加载BUF中的一个字节到EAX
add eax, 0x100 ; 将有符号数转换为无符号数
call print_unsigned_dec ; 输出该字节的十进制表示
mov eax, ' ' ; 输出一个空格
int 0x80
inc ebx ; 处理下一个字节
cmp ebx, ecx ; 检查是否处理完所有元素
jl convert_unsigned_dec
; 输出回车换行
mov eax, CR_LF
mov edx, 2
int 0x80
; 输出页码
mov eax, 4 ; 调用SYS_WRITE
mov ebx, 1 ; 输出到标准输出
mov ecx, MSG3 ; ECX指向MSG3的开头
mov edx, 10 ; MSG3的长度为10
int 0x80
; 退出程序
mov eax, 1 ; 调用SYS_EXIT
xor ebx, ebx ; 返回值为零
int 0x80
; 该函数将一个字节的十六进制表示输出到标准输出
print_hex:
push ebx ; 保存EBX的值
mov ebx, eax ; 将EAX中的值复制到EBX
and ebx, 0xF ; 取出低四位
cmp ebx, 9 ; 检查是否为数字
jle hex_digit ; 如果是数字,跳转到hex_digit
add ebx, 'A' - 10 ; 如果不是数字,加上'A'并减去10
jmp print_hex_common ; 输出该字符并返回
hex_digit:
add ebx, '0' ; 将数字转换为字符
print_hex_common:
mov eax, 4 ; 调用SYS_WRITE
mov ecx, esp ; ECX指向栈顶元素
mov edx, 1 ; 输出一个字节
int 0x80
pop ebx ; 恢复EBX的值
ret ; 返回
; 该函数将一个字节的十进制表示输出到标准输出
print_unsigned_dec:
push ebx ; 保存EBX的值
push ecx ; 保存ECX的值
push edx ; 保存EDX的值
push eax ; 保存EAX的值
mov ecx, 10 ; 加载常数10
xor edx, edx ; 将EDX清零
div ecx ; 将EAX除以10并将商存入EAX,余数存入EDX
cmp eax, 0 ; 检查商是否为零
jnz print_unsigned_dec ; 如果不为零,继续除以10
mov eax, edx ; 将余数存入EAX
add eax, '0' ; 将数字转换为字符
mov ecx, esp ; ECX指向栈顶元素
mov edx, 1 ; 输出一个字节
mov ebx, 4 ; 调用SYS_WRITE
int 0x80
add esp, 4 ; 弹出EAX和EDX
pop edx
pop ecx
pop ebx ; 恢复EBX的值
ret ; 返回
```
程序的运行结果如下:
```
有符号十六进制:7A 9B 9C 42 11 82 01 82 00 82
无符号十进制:第1页,共4页
122 155 156 66 17 130 1 130 0 130
```
注释已经解释了程序的大部分细节,这里只简要介绍一下。
程序首先计算BUF中元素的数量,然后循环处理每个元素,将其按照有符号十六进制和无符号十进制分别输出。有符号十六进制的输出比较简单,只需要将每个字节转换为十六进制表示并输出即可。无符号十进制的输出稍微麻烦一些,需要将每个字节转换为十进制表示。为了实现这个功能,我们定义了一个名为print_unsigned_dec的函数,该函数将一个字节的十进制表示输出到标准输出。程序最后输出页码并退出。
注意,由于BUF中的第一个字节是正数,因此按有符号十六进制和无符号十进制表示时输出的结果是相同的。如果BUF中的第一个字节是负数,那么有符号十六进制和无符号十进制表示的结果将不同。
阅读全文