gpt4 book ai didi

assembly - 在程序集中添加有符号数字

转载 作者:行者123 更新时间:2023-12-04 19:07:47 25 4
gpt4 key购买 nike

我想对一个数组元素求和。此数组包含正数和负数。

array db 07, 00, -3, 10, -7, 14, 9, -5, -100


lea ax, data
mov ds, ax
mov es, ax

lea si, array
mov cx, [si]
mov si, 0002h
xor ax, ax
xor dx, dx
Addition:
mov bl, [si]
cmp bl, 00h
jl NEGATIVE
xor bh, bh ;
jmp NEXTT
NEGATIVE:
mov bh, 0ffh
NEXTT:
add ax, bx
adc dx, 0
add si, 1
loop Addition

使用此代码的总和 ( DX:AX ) = 0003 FFAE H,这是错误的。我认为正确的答案是
FFFFFFAE H.

1- 我该如何解决这个问题?

2- 如何知道寄存器中的数字(例如 AX)是正数还是负数?

我用的是 emu8086

最佳答案

看来您没有适本地处理整数溢出。进位标志用于 无符号 加法和减法,但您想要 有符号 加法。溢出标志用于有符号加法,它总是在符号改变时设置。

编辑: 以前未经测试的代码无法正常工作。这是更正的(和自包含的)代码。使用 MASM 6.11 进行测试。

.model 小
.stack 4096

。数据
数组大小 dw 7
数组 db -3, 10, -7, 14, 9, -5, -100
数字数据库'0123456789abcdef'

。代码
开始:
mov ax,seg array_size ;利斧, 数据
mov ds,ax
移动,斧头

mov cx,[array_size] ; cx = 以字节为单位的数组大小。
lea si,array ; si 指向数组。

;数字在 dx:bx 中计算。

异或 dx,dx
异或 bx,bx

添加_循环:
mov al,[si] ;数字在 al 中读取。
cbw ; cbw 符号将 al 扩展到 ax。
测试斧头,斧头;检查加数的符号。
js 否定

积极的: ;加数是正的。
添加 bx,ax ;添加。
adc dx,0 ;携带。
jmp next_number

消极的: ;加数为负。
负斧;斧头 = |斧头|。
子 bx,ax ;减去。
sbb dx,0 ;借。

next_number:
公司 ;下一个号码。
循环添加_loop

;现在的结果是 dx:bx。

移动 ax,bx ;现在的结果是 dx:ax。

;其余代码仅用于打印。

推 bx ;推低字。
mov bx,dx ;将上面的单词复制到 bx。
调用 print_word_in_hexadecimal

推 dx ;推上词。
移动啊,2
mov dl,':'
整数 21 小时;打印 ':'
流行音乐dx;流行上位词。

流行音乐 bx ;流行较低的词。
调用 print_word_in_hexadecimal

移动啊,4ch
21 小时

;输入: bx:要打印的单词。
;输出: -
print_word_in_十六进制:
推bx
推cx
推dx
mov cl,4 ;算作角色。
mov ch,4 ;每个单词 4 个半字节。
next_nibble:
罗尔 bx,cl ;向左旋转 4 位。
推 bx ;推旋转词。
和 bx,0fh
mov dl,[bx+numbers]
移动啊,2;打印字符。
21 小时
流行音乐 bx ;流行旋转词。
十二月
jnz next_nibble

流行音乐
流行音乐
流行音乐
回复
结束开始

上面的代码对 8 位值进行有符号整数加法(8 位值扩展为 16 位值)。寄存器用法已更改为允许使用 cbw 以获得更清晰的代码。为简单起见,添加负数已转换为减法。数组的硬编码偏移量( mov si, 0002h ,仅当数组位于偏移量 2 时才有效)已替换为 lea si,array :

size_of_array dw 7
数组 db -3, 10, -7, 14, 9, -5, -100

以及相应的代码变化:

lea si, size_of_array ;或者您可以将这两行替换为:
mov cx, [si] ; 1. mov cx,size_of_array(TASM/MASM 语法)。
lea si, 数组

以及如何检查数字是负数还是正数?好吧,你检查最高位。例如,在我的代码中( test 执行逻辑 AND 但不保存结果,它只更新标志):

测试斧头,斧头;对 ax,ax 进行逻辑与运算,但不保存结果。
js 否定 ;如果数字为负,则跳转。

积极的:
;这个数字是正数。
jmp my_label

消极的:
;数字是负数。

我的标签:

关于assembly - 在程序集中添加有符号数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20302276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com