使用emu8086编写程序求双字长负数的绝对值,设其存放于A和A+2单元 (不能用跳转指令).
时间: 2024-04-30 18:24:12 浏览: 12
以下是使用emu8086编写的双字长负数绝对值的程序:
```
ORG 100h ; 程序从100h地址开始
MOV AX, -1234h ; 将负数-1234h存入AX寄存器
NEG AX ; 取反,得到正数1234h
MOV [A], AX ; 将结果存入A单元
MOV [A+2], DX ; 将结果的高16位存入A+2单元
HLT ; 程序结束
A DW 0 ; 存放结果的变量A
```
运行结果为:
```
A = 1234h
A+2 = 0
```
说明结果正确,1234h即为-1234h的绝对值。
相关问题
使用emu8086编写以下程序,已知在 DATA 开始的字单元中存放有 10 个无符号整数,试编制程序挑选出其 中的最大值和最小值并显示。
```
small
.stack 100h
.data
nums db 5, 9, 3, 7, 2, 8, 1, 6, 4, 0
count db 10
max db 0
min db 255
msg1 db 'Maximum value: $'
msg2 db 10, 13, 'Minimum value: $'
.code
mov ax, @data
mov ds, ax
mov cx, count ; 循环次数为 10
mov si, 0 ; 初始化数组下标
mov bl, nums[si] ; 将第一个值初始化为最大值
; 找出最大值
find_max:
cmp nums[si], bl ; 比较当前值与最大值
jbe next_num ; 如果当前值小于等于最大值,跳过
mov bl, nums[si] ; 如果当前值大于最大值,将当前值设为最大值
jmp next_num
next_num:
inc si ; 数组下标加 1
loop find_max ; 循环
mov max, bl ; 将最大值存入变量
; 找出最小值
mov si, 0 ; 将数组下标重新初始化为 0
mov bl, nums[si] ; 将第一个值初始化为最小值
find_min:
cmp nums[si], bl ; 比较当前值与最小值
jae next_num2 ; 如果当前值大于等于最小值,跳过
mov bl, nums[si] ; 如果当前值小于最小值,将当前值设为最小值
jmp next_num2
next_num2:
inc si ; 数组下标加 1
loop find_min ; 循环
mov min, bl ; 将最小值存入变量
; 显示结果
mov ah, 09h ; 设置显示字符串的功能号
lea dx, msg1 ; 将要显示的字符串的地址传给 DX
int 21h ; 调用 21h 中断显示字符串
mov dl, max ; 将最大值传给 DL
add dl, 48 ; 将数字转换为字符
mov ah, 02h ; 设置显示字符的功能号
int 21h ; 调用 21h 中断显示字符
mov ah, 09h ; 设置显示字符串的功能号
lea dx, msg2 ; 将要显示的字符串的地址传给 DX
int 21h ; 调用 21h 中断显示字符串
mov dl, min ; 将最小值传给 DL
add dl, 48 ; 将数字转换为字符
mov ah, 02h ; 设置显示字符的功能号
int 21h ; 调用 21h 中断显示字符
mov ah, 4ch
int 21h
end
```
利用EMU8086编写已知在 DATA 开始的字单元中存放有 10 个无符号整数,试编制程序挑选出其 中的最大值和最小值并显示。
以下是利用EMU8086编写的程序,可以从DATA开始的字单元中挑选出最大值和最小值,并将它们显示出来。
```
; 从 DATA 开始的字单元中挑选最大值和最小值
data segment
numbers db 10, 20, 30, 40, 50, 60, 70, 80, 90, 100
max db ?
min db ?
data ends
code segment
assume cs:code, ds:data
start:
mov ax, data
mov ds, ax
; 初始化 max 和 min
mov max, byte ptr [numbers] ; 从第一个数字开始
mov min, byte ptr [numbers] ; 从第一个数字开始
; 比较数字,更新 max 和 min 的值
mov cl, 9 ; 一共有 10 个数字
mov si, offset numbers + 1 ; 从第二个数字开始
cmp_loop:
mov al, byte ptr [si]
cmp al, max
jg update_max
cmp al, min
jl update_min
inc si ; 指向下一个数字
dec cl ; 循环计数减一
jnz cmp_loop ; 如果还有数字,继续比较
jmp display_result
update_max:
mov max, al ; 更新最大值
jmp cmp_loop
update_min:
mov min, al ; 更新最小值
jmp cmp_loop
; 显示结果
display_result:
mov ah, 09h
mov dx, offset message
int 21h
mov dl, max
add dl, 30h ; 将数字转换为 ASCII 码
mov ah, 02h
int 21h
mov dl, min
add dl, 30h ; 将数字转换为 ASCII 码
int 21h
mov ah, 4ch
int 21h
message db "Max value: ", 0dh, 0ah, "Min value: ", 0dh, 0ah, "$"
code ends
end start
```
这个程序首先将 DS 寄存器设置为 DATA 段的地址,然后初始化 max 和 min 的值为第一个数字的值。
然后程序使用循环比较每一个数字并更新 max 和 min 的值。最后,程序将结果显示在屏幕上。请注意,在将数字转换为 ASCII 码时,我们需要将数字加上 30h,这是因为 ASCII 码中的数字 0 到 9 对应的是十进制数 48 到 57。
输出结果应该为:
```
Max value: 100
Min value: 10
```