匯程式設計序 32位無符號數乘法

2021-09-21 03:16:20 字數 1405 閱讀 2712

【任務】用十六位乘法指令完成三十二位無符號數乘法(結果64位),資料用下面的記憶體單元提供:

ddata segment

x1 dw 5678h

x2 dw 1234h

y1 dw 0def0h

y2 dw 9abch

xy dw 4 dup (?)

ddata ends

其中,被乘數x=((x2)*2^16)+(x1),即x2是高16位,x1是低16位;乘數y=((y2)*2^16)+(y1),即y2是高16位,y1是低16位。

【分析】

將把32位的被乘數的乘法分別分割成2個16位的數,分別對其進行16位的乘法,然後將得到的4個16位乘法的乘積,按照各自的位相加的最終乘積,如下圖:

【參考解答】

assume cs:ccode, ds:ddata

ddata segment

x1 dw 5678h

x2 dw 1234h

y1 dw 0def0h

y2 dw 9abch

xy dw 4 dup (?)

ddata ends

ccode segment

start:

mov ax,ddata

mov ds,ax

mov ax,x1

mov dx,y1

mul dx

mov [xy],ax

mov [xy+2],dx ;被乘數低位4字元x1和乘數低位4字元y1相乘結果低位存入xy,高位存入xy+2

mov ax,x2

mov dx,y1

mul dx

add [xy+2],ax

adc [xy+4],dx ; 被乘數高位4字元x2和乘數低位4字元y1相乘結果低位存入xy+2,高位存入xy+4

mov ax,x1

mov dx,y2

mul dx

add [xy+2],ax

adc [xy+4],dx

adc [xy+6],0

; 被乘數低位4個字元x1和乘數高位4個字元y2相乘結果低位存入xy+2,高位存入xy+4

mov ax,x2

mov dx,y2

mul dx

add [xy+4],ax

adc [xy+6],dx ; 被乘數高位4個字元x2和乘數高位4個字元y2相乘結果低位存入xy+4,高位存入xy+6

mov ah,4ch

int 21h

ccode ends

end start

專接本匯程式設計序 10個有符號數相加

編寫匯程式設計序,求出首位址為buf的10個有符號字的內容之和 並存入字變數sum單元 data segment buf dw 12h,34h,56h,43h,21h,98h,09h,78h,57h,95h sum dw data ends code segment assume cs code,d...

64位Linux系統編譯32位匯程式設計序

64位linux系統編譯32位匯程式設計序的時候需要 32位系統的需求,發現使用 m32引數後,編譯提示錯誤,如下 usr bin ld 未知的 模式 32 支援的 elf x86 64 elf32 x86 64 elf i386 i386linux elf l1om elf k1om i386pe...

幾個簡單的stm32匯程式設計序

例1,用組合語言完成1 10的加法 stack top equ 0x00002000 sp初始值,常數 area reset,code dcd stack top 棧頂 msp的 dcd start 復位向量 entry 指示程式從這裡開始執行start 初始化暫存器 mov r0,10 載入迴圈變...