题目:
刚学了汇编,网上也又找到一些解法,不过还是根据自己的想法写了一下。
这道题目注意些细节,有些小知识点上课可能没有讲到,下面直接上代码
data segment
;使用ds:dx方式访问字符串时(如中断09h),
;系统会从数据段第dx位开始往后读到第一个’$’
msg1 db 'The 1 Bit is 1$'
msg2 db 'The 2 Bit is 1$'
msg3 db 'The 3 Bit is 1$'
msg4 db 'The 4 Bit is 1$'
msg5 db 'The 5 Bit is 1$'
msg6 db 'The 6 Bit is 1$'
msg7 db 'The 7 Bit is 1$'
msg8 db 'The 8 Bit is 1$'
AddressTable dw s1, s2, s3, s4 ;地址表
dw s5, s6, s7, s8
data ends
code segment
assume cs:code, ds:data
start:
mov ax, data
mov ds, ax ;设置段地址
mov ax, 0
mov bl, 00000100b ;设置 bl 中只有一位 1
again:
shr bl, 1 ;逻辑右移一位
inc al ;记录位移次数
cmp bl, 0 ;将右移后的bl与0进行比较
jne again ;若bl右移为不0,则跳转回again
dec al
mov ah, 0
shl al, 1
mov bx, ax ;al自减后右移,ax赋值给bx
jmp AddressTable[bx] ;通过地址表进行跳转
s1: lea dx, msg1
jmp s
s2: lea dx, msg2
jmp s
s3: lea dx, msg3
jmp s
s4: lea dx, msg4
jmp s
s5: lea dx, msg5
jmp s
s6: lea dx, msg6
jmp s
s7: lea dx, msg7
jmp s
s8: lea dx, msg8
jmp s
s:
mov ax, 0900h ;9号中断,输出
int 21h
mov ax, 4c00h
int 21h
code ends
end start
结果
编写完成之后编译连接就可以了。
主要参考了两篇博客:汇编语言实验-地址表和移位 以及关于db伪指令的一些内容_离天九夜的博客-优快云博客_汇编语言中db
汇编中的直接定址表_了不起的盖茨比。的博客-优快云博客_汇编地址表
第二篇中讲的很详细,可以看一下。