用32位汇编语言写出BUF 中的二进制数为 (7A9BI, -64BEH, -OEF881!,-1,820,-820),编写程序:首先 L按有符号士进数显示输出(中间用空格隔开):回车换行:然后按无符号十进数显示 第1页共4页 输出(中间用空格隔开)
时间: 2023-12-10 21:39:06 浏览: 75
以下是用32位汇编语言写出BUF中的二进制数的程序:
```assembly
section .data
BUF db 0x7A, 0x9B, 0xFF, 0xC0, 0x82, 0x00, 0xF8, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0x08, 0x00, 0x00, 0xFC, 0xFD, 0xFF, 0xFF, 0x84, 0x08, 0x00, 0x00
msg db "Signed decimal: ", 0xA, 0xD, "Unsigned decimal: ", 0xA, 0xD, 0
len equ $-msg
section .text
global _start
_start:
; print signed decimal
mov eax, 4
mov ebx, 1
mov ecx, msg
mov edx, len
int 0x80
mov esi, BUF
mov ecx, 6
print_signed_loop:
mov eax, [esi]
test eax, eax
jns print_signed_positive
neg eax
mov bl, '-'
mov [esp-4], bl
mov eax, [esi]
neg eax
print_signed_positive:
mov ebx, 10
xor edx, edx
div ebx
push dx
cmp eax, 0
jne print_signed_positive
print_signed_pop:
pop ax
add al, '0'
mov [esp-4], al
inc esp
loop print_signed_loop
; newline
mov eax, 4
mov ebx, 1
mov ecx, crlf
mov edx, 2
int 0x80
; print unsigned decimal
mov eax, 4
mov ebx, 1
mov ecx, msg+15
mov edx, 17
int 0x80
mov esi, BUF
add esi, 6
mov ecx, 6
print_unsigned_loop:
mov eax, dword [esi]
xor ebx, ebx
mov edx, 10
div edx
push dx
cmp eax, 0
jne print_unsigned_loop
print_unsigned_pop:
pop ax
add al, '0'
mov [esp-4], al
inc esp
loop print_unsigned_loop
; newline
mov eax, 4
mov ebx, 1
mov ecx, crlf
mov edx, 2
int 0x80
; exit
mov eax, 1
xor ebx, ebx
int 0x80
section .data
crlf db 0x0A, 0x0D
```
解释:
首先,我们定义了一个包含二进制数的BUF数组和一个包含输出信息的msg字符串。然后,我们使用sys_write系统调用输出"Signed decimal: "字符串。接下来,我们遍历BUF数组中的每个数,并将其转换为有符号十进制数输出。在转换过程中,我们首先检查数字是否为负数,如果是,则将其取反并输出负号。然后,我们使用除法运算将数字转换为十进制数,并将余数压入栈中。最后,我们从栈中弹出数字并输出其ASCII码表示。我们在每个数字之间输出空格,以便在输出中添加分隔符。然后,我们输出一个换行符。接下来,我们使用sys_write系统调用输出"Unsigned decimal: "字符串。然后,我们遍历BUF数组中的每个数,并将其转换为无符号十进制数输出。在转换过程中,我们使用除法运算将数字转换为十进制数,并将余数压入栈中。最后,我们从栈中弹出数字并输出其ASCII码表示。我们在每个数字之间输出空格,以便在输出中添加分隔符。最后,我们输出一个换行符。最后,我们使用sys_exit系统调用退出程序。
阅读全文