Assembly 用汇编语言编写C=(A&x2B;B)^2并转换为机器语言
请注意,我正在做一项作业,内容是: 将汇编语言中的C=(A+B)^2翻译为机器语言。 我开始研究并编写汇编程序,因此:Assembly 用汇编语言编写C=(A&x2B;B)^2并转换为机器语言,assembly,x86,Assembly,X86,请注意,我正在做一项作业,内容是: 将汇编语言中的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. 请不要太确定此汇编代码,也不知道如何将其转换为机器语言您对(A+B)²的
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.
请不要太确定此汇编代码,也不知道如何将其转换为机器语言您对(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实际上是什么…如果变量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
没有在所有地址中考虑,可能所有地址始终相对于代码开头显示):
您可以在二进制文件(AddSquar.com)的十六进制查看器/编辑器中获得相同的结果:
您还可以在反汇编中看到编码的指令:
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
我使用NDISSM实现上述功能:ndisam-b16-o0x100 AddSquar.com
如果你想手工把汇编代码转换成机器代码,恐怕你得自己动手,因为这不是讲授指令编码的好地方
从Intel或AMD在线获取CPU手册。它们是免费的。阅读有关指令编码的章节,然后手工操作。问题:
编写汇编语言代码,为以下两个二项式定理编写子程序:
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\u SQ、DIF\u SQ、
A和B是预定义的数据标签,SROUTINE\u SUM
和SROUTINE\u DIF
是子例程名称
A和B的测试值分别为3和2
您必须附加AFD调试器的快照,以SUM_SQ和
DIF_SQ
机器语言显示计算值,用于哪种体系结构?这没有意义-如果C也是您试图计算的对象,C从何而来?我同意,最后一行没有任何意义,最后一行也做不到它所写的。@Graham Borland:pentium iv@harold:我引入了C bcos,我试图将它存储到C中,它包含在寄存器Bx@Zakinster中,非常感谢。您的更正已被注意到。那么等效的机器代码呢?目标代码取决于底层的体系结构,但是如果你被要求手动组装此代码,你可能有相应的操作码。@Graham Borland:先生,我的一个朋友建议我单独转换它们。。。。你的意见是什么?是的,你只需要把每条指令翻译成它相应的操作码。@zakinster,假设我们取第2行,然后试着这样翻译:0011000101000100000101010。你是说每一行都是这样吗?@Alexey Frunze:Thanx,Alexey Frunze我非常感激
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
SROUTINE_SUM: SUM_SQ = (A+B)2 = A2 + B2 + 2*A*B
SROUTINE_DIF: DIF_SQ = (A-B)2 = A2 + B2 - 2*A*B