日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Intel汇编程序设计-整数算术指令(下)

發布時間:2025/6/17 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Intel汇编程序设计-整数算术指令(下) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

7.5 ?擴展加法和減法

? ? 擴展精度的假發和減法是指任意尺寸大小數字的加法和減法。例如要求你寫一個C++程序,把兩個1024位的整數相加,解決方案可不是那么簡單!但在匯編語言中,ADC(帶進位加)指令和SBB(帶進位減)指令非常適合于解決此類問題。

7.5.1 ?ADC指令

ADCAddWithCarry)指令把源操作數、目的操作數以及進位標志相加。指令格式與MOV指令是一樣的:

ADC ?reg ,reg

ADC ?mem ,reg

ADC ?reg ,mem

ADC ?mem ,imm

ADC ?reg ,imm

例如,下面的指令把兩個8位整數相加(FFh+FFh),16位解雇01FEh被存放在DL:AL中:

mov ?dl ,0

mov ?al ,0FFh

add ??al ,0FFh ??;AL = FE

adc ??dl ,0 ?????;DL = 01

?

兩個32位整數相加(FFFFFFFFh+FFFFFFFFh)相加,在EDX:EAX中存放64位的和0000001FFFFFFFEh:

mov ?edx ,0

mov ?eax ,0FFFFFFFFh

add ??eax ,0FFFFFFFFh

adc ??edx ,0


7.5.2 ?擴展加法的例子

? ? 下面的Extended_Add過程把兩個任意相同尺寸的整數相加,程序使用一個循環把沒對雙字相加,保存進位標志,并是僅為標志參與后面的雙字的假發運算:

?

? ? 下面摘自ExtAdd.asm的程序片段調用了Extended_Add過程,例子中傳遞的是兩個64位整數。注意特別分配了額外的雙字節以保存可能出現的進位值:

?

果真發生了進位,注意一個問題,就是比如op1?QWORD 0A2B2A40674981234h

eax ?= ?OFFSET op1

那么[eax] 74981234h ?[eax+4]0A2B2A406。一開始我在最后輸出的時候沒看懂,后臺調試的時候想起來了。

?

7.5.3 ?SBB指令

? ?SBBsubtract with borrow)指令從墓地操作數中減去源操作數和進位標志的值。指令允許你的操作與ADC是相同的。

下面的例子是執行64位的減法,把EDX:EAX設置為0000000100000000h并從中減去1,程序首先減去低32位值,進位標志將被設置,然后再減去高32位和進位標志值:

mov ?edx ,1 ???;高半部分

mov ?eax ,0 ???;低半部分

sub ??eax , 1 ??;減去1

sbb ??edx ,0 ??;減去1的高半部分(0

EDX:EAX 中的64位差值是00000000FFFFFFFFh。

7.6 ?ACCII和未壓縮十進制算術指令

? ?到現在為止,本書講述的整數算術指令都是處理二進制數值的,盡管CPU是以二進制算術方式進行運算的,但是也能處理ASCII十進制數串的算術運算。后者可以方便地有用戶輸出并在控制臺窗口中顯示,無需轉換成二進制數值。假設程序需要用戶輸入兩個數字并把他們相加,下面是一個輸出樣例,其中用書輸入了34021256

???Enter first numbers: ???3402

???Enter second number: ?1256

???The sum is: ??????????4658

在計算和顯示數字的時候有兩種選擇:

1.把兩個操作數轉換成二進制數值并相加,然后把和從二進制數轉換成ASCII碼數字串的格式化后顯示。

2.連續地把沒對ASCII數字直接相加,這樣就和是ASCII數字串,可以直接在屏幕上顯示。

第二種選擇要求在對ASCII數字相加后使用特殊指令來調整其和,指令集中有4條指令可以處理這一類的ASCII加法、減法、乘法和除法:


mov ???ah ,0

mov ???al ,’8’?????;AX = 0038h

add ????al,’2’?????;AX = 006Ah

aaa ?????????????;AX = 0100h(結果的ASCII碼調整)

or ?????ax ,3030h ;AX = 3130h=’10’(轉換成ACSCII)

AAS AAM AAD也是如此。

7.7.1 ?DAA指令

DAA指令把ADDADC指令執行后AL中的二進制數轉換成壓縮的十進制數格式。

mov ?al ,35h

add ?al ,48h ???;AL = 7Dh

daa ???????????;AL = 83h(調整結果)

7.7.2 ?DAS指令

DASdecimal adjust after subtraction)指令將SUBSBB指令執行后AL中的二進制轉換成壓縮的十進制格式。

mov bl ,48h

mov al ,85h

sub al ,bl ??;AL = 3Dh

das ??????;AL = 37h(調整結果)

7.8 本章小結

?

?

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的Intel汇编程序设计-整数算术指令(下)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。