请我正在完成一项任务,其中说: 将汇编语言中的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.
请不要确定这个汇编代码,也不知道如何将其转换为机器语言
答案 0 :(得分: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不适合进行大量的指令编码讲座。
在线获取英特尔或AMD的CPU手册。他们是免费的。阅读有关指令编码的章节,然后手动完成。
答案 1 :(得分: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究竟是什么......
答案 2 :(得分:-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_SUM
和SROUTINE_DIF
是子例程名称。
A和B的测试值分别为3和2。
您必须附加AFD调试器的快照,以显示SUM_SQ和DIF_SQ
中的计算值。