Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 用汇编语言编写C=(A&x2B;B)^2并转换为机器语言_Assembly_X86 - Fatal编程技术网

Assembly 用汇编语言编写C=(A&x2B;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)²的

请注意,我正在做一项作业,内容是: 将汇编语言中的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 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