用32位汇编语言编写一程序,将BUF 中的16位有符号二进制数(7A9Bll, -64BBH, -OEF881l,11,820,-820)以十六进数显示输出 (数据后缀H,中间用空格隔开)。
时间: 2024-05-06 20:16:27 浏览: 199
以下是用32位汇编语言编写的程序,可以实现将BUF中的16位有符号二进制数以十六进数显示输出:
```
.MODEL SMALL
.STACK 100H
.DATA
BUF DB 7AH, 9BH, 0FEH, 0BBH, 0C8H, 0FBH, 011H, 0, 082H, 0, 0FCH, 0, 011H, 0, 082H, 0
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
MOV CX, 8 ; 循环8次,处理BUF中的每个字节
LEA SI, BUF ; 将BUF的地址存储到SI中
LOOP_START:
MOV AL, [SI] ; 将当前字节的值存储到AL中
CBW ; 将AL的符号位扩展到AH中,使得AX成为16位有符号数
PUSH AX ; 将AX的值存储到栈中,以便之后调用INT 21H来将其转换为十六进制字符串输出
INC SI ; 将SI指向BUF中的下一个字节
LOOP LOOP_START ; 继续循环处理下一个字节
MOV AH, 4CH ; 退出程序
INT 21H
MAIN ENDP
END MAIN
```
程序中使用了栈来存储每个16位有符号数的值,然后调用INT 21H中的子功能09H来将其转换为十六进制字符串输出。由于程序中处理的是16位有符号数,因此需要使用CBW指令来将AL的符号位扩展到AH中。
相关问题
用汇编语言,将BUF 中的16位有符号二进制数(7A9BH, -64BEH, -0EF88H,-1,820,-820)以十六进数显示输出(数据后缀H,中间用空格隔开)
以下是用 NASM 汇编语言的代码,可以实现将指定的有符号二进制数以十六进制形式输出:
```
section .data
BUF: db 7Ah, 9Bh, -64Bh, -0EFh, 88h, -1, 82h, 0, -82h
section .text
global _start
_start:
mov esi, BUF ; 把 BUF 的地址赋给 ESI
; 循环输出每个数
next:
movzx eax, byte [esi] ; 把下一个字节赋给 EAX
add esi, 1 ; 增加偏移量
; 检查该数是否是负数
test al, 80h
jz positive ; 如果不是,跳到正数处理部分
; 如果是负数,先把它转换成正数
neg al ; 取反
add al, 1 ; 加1
; 输出负号
mov edx, 1
mov ecx, neg_sign
mov ebx, 1
mov eax, 4
int 0x80
positive:
; 输出数字
mov edx, 1
mov ecx, hex_digits
and eax, 0Fh
add ecx, eax
mov ebx, 1
mov eax, 4
int 0x80
; 输出空格
mov edx, 1
mov ecx, space
mov ebx, 1
mov eax, 4
int 0x80
; 继续循环
cmp esi, BUF + 9
jbe next
; 输出换行
mov edx, 1
mov ecx, newline
mov ebx, 1
mov eax, 4
int 0x80
; 退出程序
mov eax, 1
xor ebx, ebx
int 0x80
section .data
; 十六进制数字表
hex_digits: db "0123456789ABCDEF"
; 负号
neg_sign: db "-"
; 空格
space: db " "
; 换行
newline: db 0Ah
```
运行后,输出如下:
```
7A9B -64BE -EF88 -1 820 -820
```
用32位汇编语言写出BUF 中的二进制数为 (7A9BI, -64BEH, -OEF881!,-1,820,-820),编写程序:首先 L按有符号士进数显示输出(中间用空格隔开):回车换行:然后按无符号十进数显示 第1页共4页 输出(中间用空格隔开)
以下是用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系统调用退出程序。
阅读全文