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 的語法指令
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 圖解,來查看記憶體的狀況
是很無聊的要求,但是要寫出來也不是件容易的事情。
記住顯示的時候是十六進制,因此將數字併再一起時,仍是十六進制。
例如我的學號是 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 圖解,來查看記憶體的狀況