0

请我正在做一个作业,上面写着:将汇编语言中的 C = (A + B)^2 翻译成机器语言。我首先研究并编写了汇编程序:

MOV AX, A ; Move A to Register Ax 
ADD AX, B; Add B to A 
IMUL AX; Square(A+B) 
MOV BX, C ; Load c to Register Bx 
MOV BX, AX ; Mov (A+B)^2 to C in BX. 

请不太确定这个汇编代码,不知道如何将其转换为机器语言

4

3 回答 3

1

如果您的变量 A、B 和 C 是内存中的变量,那么代码几乎是正确的。

你只需要改变这个

MOV BX, C ; Load c to Register Bx 
MOV BX, AX ; Mov (A+B)^2 to C in BX. 

对此

MOV C, AX ; Mov (A+B)^2 to C

您可以通过汇编程序将汇编语言程序转换为机器,汇编程序是一种类似编译器的程序,将用汇编语言编写的程序作为输入程序。

那里有许多不同的 x86 汇编器。您需要选择一个,因为它们在语法和功能上略有不同(有时不是那么细微)。

如果我要用你的代码用 NASM 为 DOS 制作一个 16 位的 .COM 程序,我必须像这样重写它:

; file: AddSquar.asm
; to assemble with NASM: nasm -f bin AddSquar.asm -l AddSquar.lst -o AddSquar.com

BITS 16 ; 16-bit code
ORG 100H ; IP of first instruction is expected to be 100H in .COM programs

    MOV     AX, [A] ; Move A to Register Ax 
    ADD     AX, [B] ; Add B to A 
    IMUL    AX      ; Square(A+B) 
    MOV     [C], AX ; Mov (A+B)^2 to C

    RET ; terminate .COM program, return to DOS

A   DW 3
B   DW 4
C   DW 0

生成的列表文件 (AddSquar.lst) 包含所有编码的指令(尽管由于某种原因ORG 100H没有考虑到所有地址,可能所有地址总是相对于代码的开头显示):

 1                                  ; file: AddSquar.asm
 2                                  ; to assemble with NASM: nasm -f bin AddSquar.asm -l AddSquar.lst -o AddSquar.com
 3                                  
 4                                  BITS 16 ; 16-bit code
 5                                  ORG 100H ; IP of first instruction is expected to be 100H in .COM programs
 6                                  
 7 00000000 A1[0D00]                    MOV     AX, [A] ; Move A to Register Ax 
 8 00000003 0306[0F00]                  ADD     AX, [B] ; Add B to A 
 9 00000007 F7E8                        IMUL    AX      ; Square(A+B) 
10 00000009 A3[1100]                    MOV     [C], AX ; Mov (A+B)^2 to C
11                                  
12 0000000C C3                          RET ; terminate .COM program, return to DOS
13                                  
14 0000000D 0300                    A   DW 3
15 0000000F 0400                    B   DW 4
16 00000011 0000                    C   DW 0

您可以在二进制文件 (AddSquar.com) 的十六进制查看器/编辑器中获得相同的结果:

0000000000: A1 0D 01 03 06 0F 01 F7 │ E8 A3 11 01 C3 03 00 04  Ў♪☺♥♠☼☺чиЈ◄☺Г♥ ♦
0000000010: 00 00 00                │

您还可以在反汇编中看到编码指令:

00000100  A10D01            mov ax,[0x10d]
00000103  03060F01          add ax,[0x10f]
00000107  F7E8              imul ax
00000109  A31101            mov [0x111],ax
0000010C  C3                ret
0000010D  0300              add ax,[bx+si]
0000010F  0400              add al,0x0
00000111  0000              add [bx+si],al

我在上面使用了 NDISASM,如下所示ndisasm -b 16 -o 0x100 AddSquar.com

如果您想手动将汇编代码转换为机器代码,恐怕您必须自己动手,因为 SO 不适合进行有关指令编码的大量讲座。

从 Intel 或 AMD 在线获取 CPU 手册。他们是免费的。阅读有关指令编码的章节,然后手动完成。

于 2013-04-11T14:04:08.187 回答
0

您对 (A+B)² 的计算是正确的,但您似乎没有将其存储在正确的位置,我会这样做:

mov ax, A  ; Move A to Register Ax 
add ax, B  ; Add B to A 
imul ax    ; Square(A+B) 
mov C, ax  ; Move (A+B)^2 to C. 

但当然这取决于A,B和C实际上是什么......

于 2013-04-11T13:57:53.530 回答
-1

问题:

编写一个汇编语言代码来编写以下两个二项式定理的子程序:

SROUTINE_SUM:    SUM_SQ = (A+B)2 = A2 + B2 + 2*A*B

SROUTINE_DIF:    DIF_SQ = (A-B)2 = A2 + B2 - 2*A*B

其中SUM_SQ, DIF_SQ,A 和 B 是预定义的数据标签,而SROUTINE_SUMSROUTINE_DIF是子例程名称。

A 和 B 的测试值分别为 3 和 2。

您必须附上 AFD 调试器的快照,显示 SUM_SQ 和DIF_SQ.

于 2014-05-21T07:00:55.223 回答