汇编dosbox怎么直接执行一个程序的最后一个指令。里面好多循环。
assume cs:code,ds:data,es:table
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
//以上是表示21年的字符串 4 * 21 = 84
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
//以上是表示21年公司总收入的dword型数据 4 * 21 = 84
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
//以上是表示21年公司雇员人数的21个word型数据 2 * 21 = 42
data ends
table segment
db 21 dup ('year summ ne ?? ') //16个字节
table ends
code segment
start:
mov ax,data //data数据 放在ds
mov ds,ax
mov ax,table //table数据 放在 es
mov es,ax
mov bx,0 //data中数据定位,用于年份和收入表格
mov si,0 //table中定位,用于定位存放数据的相对位置
mov di,0 //data中用于得到员工数
mov cx,21 //每种都是对应21个数据
s:
mov ax, [bx] //将年从data 到 table 分为高16位和低16位
mov es:[si],ax //往表格里面传送数据
mov ax, [bx+2] /这里因为ax,bx都是16位,2个字节
mov es:[si+2],ax
//在table种 增加空格,表格要求
mov byte ptr es:[si+4],20h ; mov byte ptr [DI],0 将[DI]处的一个字节填为空格
//将收入从data 到 table 分为高16位和低16位
mov ax,[bx+84] //84是因为data中年份21个,一个年份4个字节,所以21*4,所以第一行的收入跟第一行的年份相差84。
mov es:[si+5],ax //因为前面有个空格,所以这里是+5
mov ax,[bx+86] //这里其实就是84+2
mov es:[si+7],ax
//table 增加空格
mov byte ptr es:[si+ 9],20h
//将雇员数从data 到 table
mov ax,[di + 168] //与上同理
mov es:[si + 10],ax
//table 增加空格
mov byte ptr es:[si+12],20h
//计算工资
//取ds处工资,这里需要32位
mov ax,[bx + 84]
mov dx,[bx + 86]
//计算人均收入
div word ptr ds:[di + 168] //因为每年雇佣员的人数都不一样,所以要相对应得寻址
//将结果存入table处
mov es:[si+13],ax
//table 增加空格
mov byte ptr es:[si + 0fh],20h
//改变三个寄存器值
add si,16 //一行16字节
add di,2 //员工占2个字节
add bx,4 //收入和年份都是4个字节
loop s
mov ax,4ch
int 21h
code ends
end start
一个一个t好类。g又找不到最后一个指令地址。
你要么用U命令反汇编并找到你要结束的指令,然后用g执行
要行直接用g指令,它会一直执行直到程序结束
古老的DOS,调试程序的确很不方便的(以前调试,一个程序要打几十个甚至上百个t的)
你打开DOSBOX后不就出来一个黑窗口吗,然后你在黑窗口里面输入命令就行了,就跟在DOS下一样操作呀。dosbox要访问你电脑里面的文件时,虚拟一个盘,映射到你电脑上某个文件夹,你把要访问的文件放在这个文件夹下就行了。