如果变量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汇编器。你需要选择一个,因为它们在语法和功能上略有不同(有时不是那么轻微)。
如果我做出DOS与NASM 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.co米):
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手册。他们是免费的。阅读关于指令编码的章节,然后手动完成。