+ -
当前位置:首页 → 问答吧 → 用汇编实现C语言的switch语句

用汇编实现C语言的switch语句

时间:2010-12-06

来源:互联网

switch (a%8) 
{case 0: b = 32; 
break; 
case 1: 
case 2: b = a + 43; 
break; 
case 3: b = 2*a; 
break; 
case 4: b--; 
break; 
case 5: 
case 6: 
case 7: printf(“Function 5_6_7”); 
 break; 

以上是C语言

assume cs:code
data segment
A dw ?
B dw ?
table dw case0,case12,case12,case3
dw case4,case567,case567,case567
msg db 'Function5_6_7$'
data ends

code segment
start: mov ax,data
mov ds,ax
mov ax,a
mov bx,ax
and bx,7
shl bx,1
jmp table[bx]
case0: mov b,32d
jmp next
case12: add ax,43d
mov b,ax
jmp next
case3: shl ax,1
mov b,ax
jmp next
case4: dec b
jmp next
case567:lea dx,msg
mov ah,9
int 21h
jmp next
next: mov AX,4c00h
int 21h
code ends
end start

这里是我照书上抄的汇编语言,可是用masm编译通不过,提示以下错误
t.ASM(17): error A2068: Cannot address with segment register
请问这个程序应该如何改正,还有就是data里面定义的case0以及下面标号处的case0怎么会是一样呢?我这个完全看不懂

作者: cwbcwb505   发布时间: 2010-12-06

assume cs:code
中要设定 ds:data
否则,编译时,编译器不知道变量属哪个段,即要不要加段前缀或加哪个段前缀。

作者: shzhfu   发布时间: 2010-12-06

data里面定义的case0相当于下面标号case0的偏移地址,即offset case0,编译联接后,用debug调试就清楚了。

作者: shzhfu   发布时间: 2010-12-06