2013-03-09 10:23:01Morris

[組合語言][作業] 第一支可以跑的程式

—Declare: (if student ID = 995202053)
DigitA db 0
DigitB db 5
DigitC db 3
MyId dw ?
—DigitA to DigitC are initialized with the last 3 digits of your student id.
—The program is to merge the three digits into MyId.

是很無聊的要求
,但是要寫出來也不是件容易的事情。
記住顯示的時候是十六進制,因此將數字併再一起時,仍是十六進制。

例如我的學號是 100502205,就是說我要合出 MyId = 0x205

先來看看代碼吧!

記得,如果型態不同,複製的時候使用 movzx 是將型態放大一倍(8 bit->16 bit, 16 bit->32 bit),

MyId 是 16 bit(WORD), DigitABC 是 8 bit(BYTE)
AX 是 16 bit(WORD), CL 是 8 bit(BYTE)。

看一下 add 的語法指令
     add     暫存器,暫存器
add     暫存器,數字(常數)
add     暫存器,變數名
add     變數名,暫存器
add     變數名,數字
沒有 add 變數名, 變數名,因此要先將另一個變數放入暫存器。



TITLE Homework #1_100502205

INCLUDE Irvine32.inc

.data
DigitA db 2
DigitB db 0
DigitC db 5
MyId   dw ?

.code
start PROC
    mov CL, 4
    movzx ax, DigitA      ;ax(16 bit) = DigitA(8 bit)
    mov MyId, ax          ;myid = ax
    shl MyId, CL          ;myid <<= 4
    movzx ax, DigitB      ;ax = DigitB
    add MyId, ax          ;myid += ax
    shl MyId, CL          ;myid <<= 4
     movzx ax, DIgitC      ;ax = DigitC
    add MyId, ax          ;myid += ax
    ret
start ENDP
END start


現在用 windbg 圖解,來查看記憶體的狀況