08 转换指令
1 符号扩充指令 (sign extend)
|  | mov al, 0FEh
cbw  ; 将 AL 做 sign ext 放在 AX 中
 | 
| cbw | cwd | cdq | movsx al, ax | movzx al, ax | 
| convert byte to word | convert word to dword | convert dword to qword | move with sign extension | move with zero extension | 
| AL->AX | AX->DX:AX | EAX->EDX:EAX | 符号扩充 | 零扩充 | 
Attention
cbw, cwd, cdq 没有参数,需要记住目标寄存器
 
1.1 扩展符号位
| cbw 扩展 al 符号位 | 
|---|
|  | mov al, -2
cbw  ; 如果不使用 cbw,要判断 al 的正负,使用分支结构
mov bl, 2
idiv bl
 | 
1.2 零扩充指令 movzx
| a 寄存器上的零扩充 | 
|---|
|  | movzx ax, al
movzx eax, al
 | 
1.3 符号扩充指令 movsx
用于淘汰 cbw 指令,方便使用且符合直觉
2 XLAT 换码指令
让 ds:bx 指向表,al 为数组的下标,执行 xlat 后有 al=ds:[bx+al]
| 查表法 in C | 
|---|
|  | char t[] = "01234567890ABCDEF";
char i;
i = 10;
i = t[i];  // 好处是,不需要更多的 if else 判断;但是比较消耗空间
 | 
| 使用查表法实现 16 进制数输出 | 
|---|
|  | .386 ; 表示程序中会用32位的寄存器
data segment use16; use16表示偏移使用16位
t db "0123456789ABCDEF"
x dd 2147483647
data ends
code segment use16
assume cs:code, ds:data
main:
   mov ax, data    ;\
   mov ds, ax      ; / ds:bx->t[0]
   mov bx, offset t;/
   mov ecx, 8
   mov eax, x
next:
   rol eax, 4
   push eax
   and eax, 0Fh
   xlat
   mov ah, 2
   mov dl, al
   int 21h
   pop eax
   sub ecx, 1
   jnz next
   mov ah, 4Ch
   int 21h
code ends
end main
 |