首页 > 解决方案 > 计算数字的平方并将它们存储在装配 8086 masm 中的 dw 中

问题描述

我正在尝试使用蛮力计算 5 的平方,所以我尝试了这个,但它没有存储任何东西dw,我dw这样定义result dw 2 dup(?)

mov ax, 5
mov bx, 5
mov cx, 1
mov dx, ax
loop1:
 add ax, dx

 cmp bx, cx
 je endLoop

 add cx, 1
 jmp loop1

endLoop:
 mov result, ax

标签: assemblydosx86-16

解决方案


计算 5 的平方

5^2 = 25 但您的代码产生 30

你的循环总共做了 5 次加法(1x 在fallthrough 和 4x 在 jump back)。
既然AX从它的原始价值开始,你得到的太多了!

要么从零开始AX,要么少做 1 次迭代:

 mov ax, 5
 mov bx, 5
 mov cx, 1
 mov dx, ax
 XOR AX, AX   ; start at zero
loop1:
 add ax, dx

 cmp bx, cx
 je endLoop

 add cx, 1
 jmp loop1

-

 mov ax, 5
 mov bx, 5
 mov cx, 1+1  ; one iteration less
 mov dx, ax
loop1:
 add ax, dx

 cmp bx, cx
 je endLoop

 add cx, 1
 jmp loop1

它不存储任何东西dw,我dw这样定义result dw 2 dup(?)

确保DS使用如下代码进行设置:

mov ax, data    ; maybe you'll need 'mov ax, @data'
mov ds, ax

尝试使用方括号的替代内存寻址:

mov [result], ax

来自评论:

我正在尝试检索这样的结果
lea si, result
inc si
mov dl, [si]
mov ah, 2h
int 21h

为什么要获取结果的第二个字节?那可能是零。
此外,结果有 2 位数字,因此您需要输出 2 个字符。

这是我最近的其他答案之一的解决方案:

mov ax, [result]     ; AX=25
mov bl, 10
div bl               ; AL=2   AH=5
add ax, "00"         ; AL='2' AH='5'
mov dx, ax
mov ah, 02h
int 21h              ; Outputs the character in DL='2'
mov dl, dh
mov ah, 02h
int 21h              ; Outputs the character in DL='5'

推荐阅读