【任務】用十六位乘法指令完成三十二位無符號數乘法(結果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 載入迴圈變...